文章来源(hbsjsd.cn)湖北高端网站定制开发公司-速建时代
背景
最近,我正在编写小程序接口,因为它的安全性很高,有必要对请求参数和响应进行加密。如果您对每种方法进行加密和解密,代码都会过于繁琐,工作量也会增加。因此,我们将进行统一的加密和解密处理,更传统的方法是通过拦截器拦截。在这里,我们选择使用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); } }
[声明]原创不易,请转发者备注下文章来源(hbsjsd.cn)【速建时代】。