• 使用aop加解密http接口


    背景

    最近在写一个小程序接口,由于安全性比较高,因此需要给请求参数和响应进行加密处理。如果在每个方法上都加密解密,那样代码就显得太繁琐了而且工作量会加大。所以,我们会统一进行加解密处理,一种比较传统的方式就是通过拦截器进行拦截处理。在这里我们选择通过使用spring的aop来实现。

    处理方案

    1.比较spring的五种通知后。很容易发现,环绕通知可以解决我们的问题,环绕通知有哪些特点呢?

    • 环绕通知是所有通知类型中功能最为强大的, 能够全面地控制连接点. 甚至可以控制是否执行连接点 。
    • 对于环绕通知来说, 连接点的参数类型必须是 ProceedingJoinPoint. 它是 JoinPoint的子接口, 允许控制何时执行, 是否执行连接点 。
    • 在环绕通知中需要明确调用 ProceedingJoinPoint 的 proceed() 方法来执行被代理的方法. 如果忘记这样做就会导致通知被执行了, 但目标方法没有被执行 。
    • 环绕通知的方法需要返回目标方法执行之后的结果, 即调用 joinPoint.proceed(); 的返回值, 否则会出现空指针异常

    2.具体看一下代码如何实现。

    • aspect类
    import com.legendnet.elecmeter.utils.EncryptUtils;
    import lombok.extern.slf4j.Slf4j;
    import org.apache.commons.lang.StringUtils;
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Pointcut;
    import org.springframework.stereotype.Component;
    import org.springframework.web.context.request.RequestContextHolder;
    import org.springframework.web.context.request.ServletRequestAttributes;
    
    import javax.servlet.http.HttpServletRequest;
    
    /**
     * @Author 情系IT
     * @Description
     * @Date 2019-12-04 14:55
     */
    @Aspect
    @Slf4j
    @Component
    public class HttpAspect {
    
        // 定义切点controller包及子包下面的所有方法
        @Pointcut("execution(public * com.legendnet.elecmeter.controller..*.*(..))")
        public void httpRequest(){}
    
        @Around("httpRequest()")
        public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Exception {
    
            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            HttpServletRequest request = attributes.getRequest();
    
            // target 判断来源然后根据不同的解密算法解密
            String target = request.getParameter("target");
            String paramCode = request.getParameter("param_code");
            paramCode = paramCode.replaceAll(" ", "+");
    
            if(StringUtils.isNotBlank(paramCode)){
                if("miniProgram".equals(target)){
                    paramCode = EncryptUtils.aesDecrypt(paramCode);
                }
    
                log.info("请求参数为:【{}】",paramCode);
            }
            request.setAttribute("param_code",paramCode);
            Object proceed = "";
            try {
                proceed = proceedingJoinPoint.proceed();
                if("miniProgram".equals(target)){
                	proceed = EncryptUtils.aesEncrypt(proceed.toString());
                }
            } catch (Throwable throwable) {
                throwable.printStackTrace();
            }
            return proceed;
        }
    }
    
    • controller类
    import com.alibaba.fastjson.JSON;
    import com.legendnet.elecmeter.common.ResultBean;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    
    /**
     * @Author 情系IT
     * @Description
     * @Date 2019-12-04 15:23
     */
    @RestController
    @Slf4j
    public class TestController {
    
        @RequestMapping("test")
        public String test(HttpServletRequest request){
            String param_code = request.getAttribute("param_code").toString();
    
            log.info("我已接收到参数,参数为:【{}】",paramCode);
    
            ResultBean resultBean = new ResultBean();
            resultBean.fillData("这就是我的响应");
            return JSON.toJSONString(resultBean);
        }
    }
    

    3.由于小程序和app的加密方式不同,为了代码的高可用,我们通过target参数来判断其来源,然后选择不同的加解密方式进行处理。

    大功告成,接下来安心的写接口就可以了,妈妈再也不用担心我去处理加密解密的问题了。

    如果文章对您有帮助,请记得点赞关注哟~
    欢迎大家关注我的公众号:情系IT,每日推送技术文章供大家学习参考。

  • 相关阅读:
    vue-打包为webapp,如何解决应用内跳转外部链接返回导致退出应用
    vue-引入mui.js报错如何处理
    微信小程序中-折线图
    Docker基础命令
    retry示例
    authenticate验证的流程
    django生产环境启动问题
    redis基本操作
    DBUtils数据库连接池
    外部程序调用Django模块的解决办法
  • 原文地址:https://www.cnblogs.com/zhixie/p/11990686.html
Copyright © 2020-2023  润新知