新聞動態

                                                                                  位置:首頁 新聞動態 建站學堂

                                                                                  網站建設|使用aop加解密http接口

                                                                                  新聞動態
                                                                                  2019年12月09日 閱讀:3205次

                                                                                  背景

                                                                                  最近,我正在編寫小程序接口,因為它的安全性很高,有必要對請求參數和響應進行加密。如果您對每種方法進行加密和解密,代碼都會過于繁瑣,工作量也會增加。因此,我們將進行統一的加密和解密處理,更傳統的方法是通過攔截器攔截。在這里,我們選擇使用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);
                                                                                       }
                                                                                   }

                                                                                  上一篇

                                                                                  下一篇

                                                                                  亚洲中文字幕在线19页_99久久国产精品免费热7788_欧美专区日韩专区综合专区_小泽玛利亚一区_gogo999亚洲肉体艺术