最近在写一个小程序接口,由于安全性比较高,因此需要给请求参数和响应进行加密处理。如果在每个方法上都加密解密,那样代码就显得太繁琐了而且工作量会加大。所以,我们会统一进行加解密处理,一种比较传统的方式就是通过拦截器进行拦截处理。在这里我们选择通过使用spring的aop来实现。
1.比较spring的五种通知后。很容易发现,环绕通知可以解决我们的问题,环绕通知有哪些特点呢?
2.具体看一下代码如何实现。
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; } }
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); } }
3.由于小程序和app的加密方式不同,为了代码的高可用,我们通过target参数来判断其来源,然后选择不同的加解密方式进行处理。
大功告成,接下来安心的写接口就可以了,妈妈再也不用担心我去处理加密解密的问题了。
如果文章对您有帮助,请记得点赞关注哟~