当前位置:   article > 正文

Aop+自定义注解对入参进行操作(过滤、解密)_aop+注解实现前后端传参加解密

aop+注解实现前后端传参加解密

背景:对外提供接口,为了数据安全,接口入参进行了数据加密,接口收到参数后需要进行解密;如果每一个接口都要对入参进行一 一的解密操作,就大大增加了代码量和工作量;

所以,这里使用自定义注解加Aop进行无侵入式的操作;

第一步:自定义注解

  1. package com.example.demo.common;
  2. import java.lang.annotation.ElementType;
  3. import java.lang.annotation.Retention;
  4. import java.lang.annotation.RetentionPolicy;
  5. import java.lang.annotation.Target;
  6. /**
  7. * 自定义注解
  8. */
  9. @Retention(RetentionPolicy.RUNTIME)
  10. @Target({ElementType.METHOD}) // 表示该注解只能用来修饰在方法上
  11. public @interface SystemAopAnnotation {
  12. String value() default "自定义注解";
  13. }

第二步:参数处理

  1. package com.example.demo.common;
  2. import java.util.Arrays;
  3. import java.util.Base64;
  4. import java.util.HashMap;
  5. import java.util.Map;
  6. import java.util.Map.Entry;
  7. import org.aspectj.lang.ProceedingJoinPoint;
  8. import org.aspectj.lang.annotation.Around;
  9. import org.aspectj.lang.annotation.Aspect;
  10. import org.slf4j.Logger;
  11. import org.slf4j.LoggerFactory;
  12. import org.springframework.stereotype.Component;
  13. import com.alibaba.fastjson.JSON;
  14. import com.alibaba.fastjson.JSONObject;
  15. /**
  16. * aop实现
  17. * @author zhaoheng
  18. */
  19. @Aspect
  20. @Component
  21. public class DeInterceptor {
  22. private static final Logger log = LoggerFactory.getLogger(DeInterceptor.class);
  23. /**
  24. * 在方法执行之前、后执行该方法
  25. * 设置需要执行该方法的类路径和注解
  26. */
  27. @Around("execution(* com.example.demo.biz.*.*(..)) && (@annotation(com.example.demo.common.SystemAopAnnotation))")
  28. public Object interceptor(ProceedingJoinPoint point) throws Throwable {
  29. // 获取请求参数
  30. Object[] args = point.getArgs();
  31. String reqestParam = Arrays.toString(args);
  32. log.info("interceptor-入参:{}",reqestParam);
  33. // 处理参数
  34. JSONObject jsonObject = (JSONObject) JSON.toJSON(args[0]);
  35. Map<String, Object> map = new HashMap<String, Object>();
  36. // 把json对象转换为Map集合便于遍历处理参数
  37. map = JSON.toJavaObject(jsonObject, Map.class);
  38. for (Entry<String, Object> entry : map.entrySet()) {
  39. /**
  40. * 入参是base64编码,这里进行解码;也可以是其他方式加密,这里进行解密
  41. */
  42. byte[] base64decodedBytes = Base64.getDecoder().decode(entry.getValue().toString());
  43. String valueString = new String(base64decodedBytes, "utf-8");
  44. map.put(entry.getKey(), valueString);
  45. }
  46. // 获取接收参数的类全路径
  47. String classPath = args[0].getClass().getName();
  48. // 把处理后的参数放回去
  49. args[0] = JSONObject.parseObject(JSONObject.toJSONString(map), Class.forName(classPath));
  50. // 获取响应数据
  51. Object result = point.proceed(args);
  52. return result;
  53. }
  54. }

第三步:测试

1.实体类

  1. import java.io.Serializable;
  2. public class User implements Serializable{
  3. private static final long serialVersionUID = -1101509992831103288L;
  4. private String id;
  5. private String name;
  6. public String getId() {
  7. return id;
  8. }
  9. public void setId(String id) {
  10. this.id = id;
  11. }
  12. public String getName() {
  13. return name;
  14. }
  15. public void setName(String name) {
  16. this.name = name;
  17. }
  18. public static long getSerialversionuid() {
  19. return serialVersionUID;
  20. }
  21. @Override
  22. public String toString() {
  23. return "User [id=" + id + ", name=" + name + "]";
  24. }
  25. }

2.controller

  1. import com.example.demo.common.SystemAopAnnotation;
  2. @CrossOrigin(origins = "*")// 允许跨越
  3. @RestController
  4. @RequestMapping("test")
  5. public class TestController {
  6. private static final Logger log = LoggerFactory.getLogger(TestController.class);
  7. // 测试的方法
  8. @RequestMapping("/saveUser")
  9. @SystemAopAnnotation("添加用户接口") // 自定义的注解
  10. public String saveUser(@RequestBody User user) {
  11. log.info("Controller-收到的请求参数:{}",user.toString());
  12. return user.toString();
  13. }
  14. }

测试结果:

请求之前对数据进行了base64加密,经过aop处理(解密),controller得到的是解密后的数据

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/615726
推荐阅读
相关标签
  

闽ICP备14008679号