使用aop加解密http接口
2019-12-05 16:01:31来源:博客园 阅读 ()
使用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);
}
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);
}
}
3.由于小程序和app的加密方式不同,为了代码的高可用,我们通过target参数来判断其来源,然后选择不同的加解密方式进行处理。
大功告成,接下来安心的写接口就可以了,妈妈再也不用担心我去处理加密解密的问题了。
如果文章对您有帮助,请记得点赞关注哟~
欢迎大家关注我的公众号:情系IT,每日推送技术文章供大家学习参考。
原文链接:https://www.cnblogs.com/zhixie/p/11990686.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- Spring Boot 实现配置文件加解密原理 2020-06-08
- 聊聊 OAuth 2.0 的 token expire_in 使用 2020-06-08
- 为什么阿里巴巴Java开发手册中强制要求接口返回值不允许使用 2020-06-06
- 学习笔记之方法引用 2020-06-06
- idea使用小技巧(一) 2020-06-05
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash