Aop做拦截器 获取请求头数据 修改请求数据拦截返回值修改返回值数据
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做拦截器 获取请求头数据 修改请求数据拦截返回值修改返回值数据相关推荐
- 拦截器获取请求参数post_SpringBoot拦截器如何获取http请求参数
1.1.获取http请求参数是一种刚需 我想有的小伙伴肯定有过获取http请求的需要,比如想 前置获取参数,统计请求数据 做服务的接口签名校验 敏感接口监控日志 敏感接口防重复提交 等等各式各样的场景 ...
- Java微信公众号开发之使用拦截器获取粉丝openID
目的 本次实现的目的是:在微信公众号项目中,可能在每次访问页面的时候需要带上openid或者授权,查数据库太耗性能.多次多个地方去调授权接口也不是最佳的方案,如果能利用拦截器拦截到每次请求访问后台,这 ...
- MySQL拦截器获取xml id_关于mybatis拦截器,有谁知道怎么对结果集进行拦截,将指定字段查询结果进行格式化...
用MyBatis结果集拦截器做过这样一个需求: 由于项目需求经常变动,项目MySQL数据库都是存放JSON字符串,例如:用户的基本信息随着版本升级可能会有变动 数据表 CREATE TABLE `ac ...
- 通过拦截器获取控制类requestMapping注解中的属性值
1.控制类: /*** 根据id删除*/@RequestMapping(value = "/user/{id}", method = RequestMethod.DELETE,n ...
- android 方法拦截器,Android的OkHttp包中的HTTP拦截器Interceptor用法示例
OkHttp(GitHub:https://github.com/square/okhttp) 的 Interceptor 就如同名称「拦截器」一样,拦截你的 Request 做一些你想做的事情再送出 ...
- java 拦截器响应中取所有参数,spring boot拦截器中获取request post请求中的参数
最近有一个需要从拦截器中获取post请求的参数的需求,这里记录一下处理过程中出现的问题. 首先想到的就是request.getParameter(String )方法,但是这个方法只能在get请求中取 ...
- 拦截器获取请求参数post_spring boot拦截器中获取request post请求中的参数
最近有一个需要从拦截器中获取post请求的参数的需求,这里记录一下处理过程中出现的问题. 首先想到的就是request.getParameter(String )方法,但是这个方法只能在get请求中取 ...
- filter 拦截器 获取http请求参数
里面一些方法使用了hutool的工具类 可以替换成你自己习惯的 工具类不是记录的主要东西. 记录点 1.怎么创建拦截器 2.怎么统一管理拦截器是否启用和输用顺序 3.怎么获取传入的参数 4.怎么获取返 ...
- Spring拦截器获取request请求体中的json数据,并转换成Java对象的解决办法
1.要被拦截的Controller接口 我们需要一个更新用户信息接口,请求方式为POST,参数类型为对象类型(UserInfo),代码如下: @Resource private UserService ...
最新文章
- tensorflow-tensorboard 0.4.0rc3 has requirement bleach==1.5.0, but you'll have bleach 2.0.0 which is
- c++ try catch
- 消息中间件核心实体(1)
- 因子分解(信息学奥赛一本通-T1210)
- Objective-C 【从文件中读写字符串(直接读写/通过NSURL读写)】
- 今天我的MSN提示升级了
- Python网络编程、爬虫之requests模块使用
- 谈谈计算机专业职业技能,计算机专业职业技能论文
- qt自定义QtWidgets
- flowplayer视频播放插件
- 考研逻辑整理 - 性质判断及其变形推理
- lzw编码c语言,LZW字典压缩算法的实现
- VMware vCenter Converter 物理机迁移
- Entity and Evidence Guided Relation Extraction for DocRED
- YunEngine SDK已经开始发放了!!!
- swagger工具编写接口文档
- babylonjs 分部加载模型_基于Babylonjs自制WebGL3D模型编辑器
- 教你怎么添加自己QQ为QQ好友 最新方法
- 卷积神经网络常用模型,卷积神经网络数学建模
- 机动车排放微观控制-汽油机内净化技术