AOP 拦截器拦截请求头 修改请求参数

请求数据拦截

本页面 按住 ctrl 和 F 搜索
@Before(“doPointcut()”)

返回值数据拦截

本页面 按住 ctrl 和 F 搜索
@AfterReturning(returning = “rvt”,pointcut = “doPointcut()”)

需求解释

每一次请求参数 AOP 拦截 获取请求头某个数据,并且将数据填充到参数中

准备

1.目录结构

2总结

aop做拦截不是很灵活,不如拦截器灵活,但是某些场景是必须要用到aop的
这个拦截是将请求头中的登录信息拿出来封装到对象中
主要代码就是所有bean继承CommonPojo类
aop会操作CommonPojo 类来复制userId

3.代码

注意事项

TestAspect

package yu.com.test2.apo;import com.alibaba.fastjson.JSON;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import yu.com.test2.Result;
import yu.com.test2.TestPojo;import javax.servlet.http.HttpServletRequest;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;/*** @Classname TestAspect* @Date 2021/4/6 15:43* @Created by yufx*/@Aspect // FOR AOP
@Order(-99) // 控制多个Aspect的执行顺序,越小越先执行
@Configuration // 配置类
public class TestAspect {/*setter方法o:要操作类的对象args:属性名attributeValue:属性值*/public static void setXxx(Object o, String args, Object attributeValue) {Class cls = o.getClass();//判断该属性是否存在Field field = null;try {field = cls.getDeclaredField(args);if (field == null) {field = cls.getField(args);}if (field == null) {return;}} catch (NoSuchFieldException e) {e.getMessage();}String fieldName = "set" + args.substring(0, 1).toUpperCase() + (args.length() > 1 ? args.substring(1) : "");Method method = null;try {method = cls.getMethod(fieldName, attributeValue.getClass());method.invoke(o, attributeValue);} catch (NoSuchMethodException e) {e.getMessage();} catch (IllegalAccessException e) {e.getMessage();} catch (InvocationTargetException e) {e.getMessage();}}@Pointcut( "execution( * yu.com.test2..*.*(..))")/*** 这个方法的方法名要和下面注解方法名一致*/public void doPointcut(){}@Before("doPointcut()")public void doBefore(JoinPoint joinPoint) throws IntrospectionException, InvocationTargetException, IllegalAccessException, InstantiationException {// 请求开始时间ServletRequestAttributes sra = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();String headValue  = sra.getRequest().getHeader("userId");LOG.info(headValue);if (headValue != null && !"".equals(headValue)) {//获取目标方法的参数信息Object[] obj = joinPoint.getArgs();for (Object argItem : obj) {if (argItem instanceof Object) {setXxx(argItem, "userId", headValue);}}} else {LOG.info("userId 无数据 请联系管理员");}}@After("doPointcut()")public void doAfter(){System.out.println("==doAfter==");}/*** 返回值拦截修改 controller返回的对象属性不可以修改* 只能修改对象里的值属性* @param rvt* @return*/@AfterReturning(returning = "rvt",pointcut = "doPointcut()")public Object AfterExec(Object rvt){System.out.println(rvt+"========================");Result result1 = (Result) rvt;result1.setMsg("123645");result1.setSuccess(true);return rvt;}/*** 环绕通知返回值类型Object,对应所有被拦截方法的返回值类型,不能为void*/@Around("doPointcut()")public Object doAround(ProceedingJoinPoint proceedingJoinPoint)throws Throwable{System.out.println("==doAround.before==");Object ret=proceedingJoinPoint.proceed();System.out.println("==doAround.after=="+ret);return ret;}
}

TestAspect

package yu.com.test2;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.io.Serializable;/*** 封装返回结果*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class  Result implements Serializable{private boolean success;//执行结果,true为执行成功 false为执行失败private String msg;//返回结果信息,主要用于页面提示信息private Object data;//返回数据public static Result okData(Object data) {Result result = new Result();result.data = data;return result;}public static Result okDataMsg(Object data , String msg) {Result result = new Result();result.data = data;result.msg = msg;return result;}public static Result okDataMsgSuccess(Object data, String msg ,boolean success) {Result result = new Result();result.data = data;result.msg = msg;result.success = success;return result;}}

TestController

package yu.com.test2;import org.springframework.web.bind.annotation.*;/*** @Classname TestController* @Date 2021/4/6 15:47* @Created by yufx*/
@RestController
@RequestMapping("/test")
public class TestController {@PostMapping("/show")public String show(@RequestBody TestPojo testPojo) {System.out.println("show2----------------------------------"+testPojo);return "OK";}@PostMapping("/show2")public String show2(@RequestBody TestPojo testPojo) {System.out.println("show2----------------------------------"+testPojo);return "OK2";}
}

CommonPojo

package yu.com.test2;import lombok.Data;/*** @Classname CommonPojo* @Date 2021/4/8 16:59* @Created by yufx*/
@Data
public class CommonPojo {private String userId;
}

TestPojo

package yu.com.test2;import lombok.Data;
import lombok.ToString;/*** @Classname TestPojo* @Date 2021/4/6 16:54* @Created by yufx*/
@Data
@ToString
public class TestPojo  extends CommonPojo{private String name;}
ate 2021/4/6 16:54* @Created by yufx*/
@Data
@ToString
public class TestPojo {private String name;private String userId;}

Aop做拦截器 获取请求头数据 修改请求数据拦截返回值修改返回值数据相关推荐

  1. 拦截器获取请求参数post_SpringBoot拦截器如何获取http请求参数

    1.1.获取http请求参数是一种刚需 我想有的小伙伴肯定有过获取http请求的需要,比如想 前置获取参数,统计请求数据 做服务的接口签名校验 敏感接口监控日志 敏感接口防重复提交 等等各式各样的场景 ...

  2. Java微信公众号开发之使用拦截器获取粉丝openID

    目的 本次实现的目的是:在微信公众号项目中,可能在每次访问页面的时候需要带上openid或者授权,查数据库太耗性能.多次多个地方去调授权接口也不是最佳的方案,如果能利用拦截器拦截到每次请求访问后台,这 ...

  3. MySQL拦截器获取xml id_关于mybatis拦截器,有谁知道怎么对结果集进行拦截,将指定字段查询结果进行格式化...

    用MyBatis结果集拦截器做过这样一个需求: 由于项目需求经常变动,项目MySQL数据库都是存放JSON字符串,例如:用户的基本信息随着版本升级可能会有变动 数据表 CREATE TABLE `ac ...

  4. 通过拦截器获取控制类requestMapping注解中的属性值

     1.控制类: /*** 根据id删除*/@RequestMapping(value = "/user/{id}", method = RequestMethod.DELETE,n ...

  5. android 方法拦截器,Android的OkHttp包中的HTTP拦截器Interceptor用法示例

    OkHttp(GitHub:https://github.com/square/okhttp) 的 Interceptor 就如同名称「拦截器」一样,拦截你的 Request 做一些你想做的事情再送出 ...

  6. java 拦截器响应中取所有参数,spring boot拦截器中获取request post请求中的参数

    最近有一个需要从拦截器中获取post请求的参数的需求,这里记录一下处理过程中出现的问题. 首先想到的就是request.getParameter(String )方法,但是这个方法只能在get请求中取 ...

  7. 拦截器获取请求参数post_spring boot拦截器中获取request post请求中的参数

    最近有一个需要从拦截器中获取post请求的参数的需求,这里记录一下处理过程中出现的问题. 首先想到的就是request.getParameter(String )方法,但是这个方法只能在get请求中取 ...

  8. filter 拦截器 获取http请求参数

    里面一些方法使用了hutool的工具类 可以替换成你自己习惯的 工具类不是记录的主要东西. 记录点 1.怎么创建拦截器 2.怎么统一管理拦截器是否启用和输用顺序 3.怎么获取传入的参数 4.怎么获取返 ...

  9. Spring拦截器获取request请求体中的json数据,并转换成Java对象的解决办法

    1.要被拦截的Controller接口 我们需要一个更新用户信息接口,请求方式为POST,参数类型为对象类型(UserInfo),代码如下: @Resource private UserService ...

最新文章

  1. tensorflow-tensorboard 0.4.0rc3 has requirement bleach==1.5.0, but you'll have bleach 2.0.0 which is
  2. c++ try catch
  3. 消息中间件核心实体(1)
  4. 因子分解(信息学奥赛一本通-T1210)
  5. Objective-C 【从文件中读写字符串(直接读写/通过NSURL读写)】
  6. 今天我的MSN提示升级了
  7. Python网络编程、爬虫之requests模块使用
  8. 谈谈计算机专业职业技能,计算机专业职业技能论文
  9. qt自定义QtWidgets
  10. flowplayer视频播放插件
  11. 考研逻辑整理 - 性质判断及其变形推理
  12. lzw编码c语言,LZW字典压缩算法的实现
  13. VMware vCenter Converter 物理机迁移
  14. Entity and Evidence Guided Relation Extraction for DocRED
  15. YunEngine SDK已经开始发放了!!!
  16. swagger工具编写接口文档
  17. babylonjs 分部加载模型_基于Babylonjs自制WebGL3D模型编辑器
  18. 教你怎么添加自己QQ为QQ好友 最新方法
  19. 卷积神经网络常用模型,卷积神经网络数学建模
  20. 机动车排放微观控制-汽油机内净化技术

热门文章

  1. 怎么解决相位抵消_如何确认并纠正混音中的相位问题
  2. c++解鸡兔同笼(3)
  3. erlang学习半个月的心得
  4. 学费最贵研究生专业!
  5. peetch:一个针对eBPF的安全实践研究平台
  6. 简述VL163 QFN28(USB-C Gen2 10GpbsSwtich芯片)运用
  7. 小白级教程-高通410版随身WiFi切换成自己上网教程,不用刷机
  8. 服务器V6型号什么意思,ipv6接口是什么意思
  9. 如何快速打开服务器管理器 常用方法
  10. 小程序源码:趣味娱乐多流量主下载趣味制作,藏头诗,隐藏图-多玩法安装简单