网站建设|使用aop加解密http接口

建站学堂     |      2019-12-09 | 阅读数:73次

背景

最近,我正在编写小程序接口,因为它的安全性很高,有必要对请求参数和响应进行加密。如果您对每种方法进行加密和解密,代码都会过于繁琐,工作量也会增加。因此,我们将进行统一的加密和解密处理,更传统的方法是通过拦截器拦截。在这里,我们选择使用Spring的AOP来实现它。

处理方案

1.比较了Spring的五种通知之后,不难发现环绕式通知可以解决我们的问题。环绕式通知的特点是什么?

环绕式通知是所有通知类型中最强大的,可以全方位地控制连接点。您甚至可以控制连接点是否被执行。

对于环绕声通知,连接点的参数类型必须是ProcedingJoinPoint。它是JoinPoint的一个子接口,允许控制何时执行以及是否执行连接点。

需要在环绕声通知中显式调用Process()方法来执行代理方法。如果您忘记这样做,通知将被执行,但目标方法不会被执行。

围绕通知的方法需要在执行目标方法后返回结果,即调用jointPoint.try()的返回值;否则将出现空指针异常

 

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);
         }
         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(@RequestParam("param_code") String paramCode){
         log.info("我已接收到参数,参数为:【{}】",paramCode);
         ResultBean resultBean = new ResultBean();
         resultBean.fillData("这就是我的响应");
         return JSON.toJSONString(resultBean);
     }
 }
分享到
  • 微信好友
  • QQ好友
  • QQ空间
  • 腾讯微博
  • 新浪微博
  • 人人网