spring拦截器传递传递参数到controller+Aop切面环绕方法传递参数到目标方法
一.前言
由于业务需要,在网上找了很久得到了这两种方式。本文代码偏少,主要讲解一下怎么传,如何接收,也记录一下,以便之后查看。
二.Spring拦截器传递参数到controller
下面是我拦截器中的代码,preHandle中设置变量,然后在controller中得到
1,变量放在request请求域中,request.setAttribute(“getAttribute”, “getAttribute”);
2,变量放在全局Servlet Context中,request.getServletContext().setAttribute(“getServletContext”, “getServletContext”);
3,变量放在request的请求头中,在controller中在到请求头header中得到数据
@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws RRException {//把变量放在request请求域中,仅可以被这次请求,即同一个requerst使用request.setAttribute("getAttribute", "getAttribute");//放在全局的ServletContext中,每一个web应用拥有一个ServletContext,是全局对象,具体请百度//把变量放在这里面,在之后什么地方都可以访问request.getServletContext().setAttribute("getServletContext", "getServletContext");//把自己的变量放在头部reflectSetHeader(request, "header", "header");return true;}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("拦截器之后输出ServletContext中保存的数据:"+request.getServletContext().getAttribute("getServletContext"));}//把自己想要的信息设置到header头部,就相当于是在request的请求头部添加一个键值对,保存自己的数据private void reflectSetHeader(HttpServletRequest request, String key, String value){Class<? extends HttpServletRequest> requestClass = request.getClass();try {Field request1 = requestClass.getDeclaredField("request");request1.setAccessible(true);Object o = request1.get(request);Field coyoteRequest = o.getClass().getDeclaredField("coyoteRequest");coyoteRequest.setAccessible(true);Object o1 = coyoteRequest.get(o);Field headers = o1.getClass().getDeclaredField("headers");headers.setAccessible(true);MimeHeaders o2 = (MimeHeaders)headers.get(o1);o2.removeHeader(key);o2.addValue(key).setString(value);} catch (Exception e) {e.printStackTrace();}}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {}
下面是我controller中的代码
@GetMapping("/hello")public Result hello( String hello){System.out.println(hello);//得到头部保存的信息System.out.println(getHeadToken((ServletRequestAttributes) RequestContextHolder.getRequestAttributes(), "header"));//得到servlet中的requestHttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();System.out.println("request.getAttribute得到数据:"+request.getAttribute("getAttribute"));System.out.println("request.getServletContext().getAttribute得到全局数据:"+request.getServletContext().getAttribute("getServletContext"));return null;}public static String getHeadToken(ServletRequestAttributes attributes, String key) {/**** 功能描述: 得到头部保存的信息,通过key得到value** @param: [attributes, key] attribute 固定(ServletRequestAttributes) RequestContextHolder.getRequestAttributes() key:为头部保存信息的键子key* @return: java.lang.String*/HttpServletRequest request = attributes.getRequest();Map<String, String> map = new HashMap<String, String>();Enumeration headerNames = request.getHeaderNames();while (headerNames.hasMoreElements()) {String key1 = (String) headerNames.nextElement();String value = request.getHeader(key1);map.put(key1, value);}return map.get(key);}
看控制台输出,第一个 null,因为controller方法上没有参数传过来
后面的都是从拦截器那边传过来的数据。于是,最后需求实现。
三.Aop切面传递参数到目标方法
切面中的环绕方法,实现切面传递参数到目标方法。
Object o[] = proceedingJoinPoint.getArgs();这句代码就是得到从前端(保存在request中的变量的值)传递到controller中的值。
比如request请求,get方式, http://www.qinjie.xyz/hello?a=1&b=2&c=3;
我controller目标方法接收a,b,c,d,e,f这6个变量值,则上面方法得到的o[]={1,2,3,null,null,null}。有兴趣可以自己测试一下试试。然后我在环绕方法执行目标方法之前替换d = 4,这在controller中就可以接收到a=1,b=2,c=3,d=4,e=null,f=null。
同理,我也可以替换掉a=11,b=22,在controller中就是a=11,b=22 了。
我把关键性代码贴出来。
@Around(value = "InterceptController()")public Object doAround(ProceedingJoinPoint proceedingJoinPoint)throws Throwable{//得到传递给目标方法的参数值Object o[] = proceedingJoinPoint.getArgs();//得到目标方法的参数名,得到controller(目标方法)的变量的名字String[] paramNames = ((CodeSignature) proceedingJoinPoint.getSignature()).getParameterNames();}return proceedingJoinPoint.proceed(o);//返回执行目标方法,并且把转换修改后的参数值传递到controller(目标方法)}
四.总结
- aop切面确实好用,降低了代码的耦合性,可以非常方便的在后期增加功能
- aop和拦截器都可以进行拦截,相当于都是拦截器
- 这样一个需求,在我这边主要是为了降低前端和后端的交互,以前前端需要传递一个参数过来,但是现在不用传递过来了,我直接在拦截器中或aop中进行手动添加参数,传递到controller。
好像写的有点复杂了,如果大家有没有看懂的,或是有疑问的可以私聊我哟。(_),大家一起加油!加油!(。・∀・)ノ
spring拦截器传递传递参数到controller+Aop切面环绕方法传递参数到目标方法相关推荐
- Spring拦截器校验Json格式参数
Json已经成为一种主流的数据传输格式,请求参数是整个RequestBody. 那么,拦截器中如何获取Json呢? 办法是:通过request.getInputStream. RequestBody是 ...
- Spring拦截器(Interceptor)的运用
在以Spring为基础的框架(例如Spring boot, Spring MVC)中,会使用到一种名为拦截器的东西,它属于面向切面编程的架构模式,为我们在API调用前后做一些额外操作提供了便利. 如何 ...
- Java(Spring拦截器、过滤器、AOP)
过滤器: 过滤器是servlet提供的API,需要实现javax.servlet.Filter接口.过滤器可以拦截到方法的请求和响应(ServletRequest request, SetvletRe ...
- Spring拦截器实现登录拦截
hello,大家好,好久没发文章了,之前一段时间因为没遇到太好的内容.昨天研究了下登录时Spring拦截器实现功能,今天和大家分享下,有问题的话欢迎大家指出与批评,好,下面进入正题. 说起拦截器 ...
- 「深入源码」Spring拦截器的实现原理和执行机制
我一直以为Spring的拦截器是基于AOP原理实现的,仔细阅读完源码,才知道自己的认知是错误的. 今天我们就从源码的角度剖析下Spring拦截器. 一.创建一个自己的拦截器 实现一个自己的拦截器,需要 ...
- Spring拦截器的实现以及通过注解实现拦截
五 本篇是本人记录对于Spring的拦截器简单的使用记录,以及通过自定义注解的方式实现其拦截目的 首先看一下简单的实现 第一步:定义一个测试类,用于向后台发送请求 @RestController pu ...
- Spring拦截器的切入点定义
Spring拦截器定义切入点: 1.NameMatchMethodPointcutAdvisor (根据方法名匹配织入) <bean id="advisor" class= ...
- spring拦截器不生效
在平时休闲时间做一个学习型项目练手,在练习过程中,遇到一个spring拦截器不生效的问题,拦截器代码如下: @Aspect // 该注解标示该类为切面类 @Component public class ...
- spring 两次进入拦截器_4.SpringBoot 拦截器Fliter,Interceptor,Controller……
在项目的开发中,在某些情况下,我们需要对客户端发出的请求进行拦截,常用的API拦截方式有Fliter,Interceptor,ControllerAdvice以及Aspect. 上面的图是Spring ...
最新文章
- ICCV 2021 Oral | NerfingMVS:引导优化神经辐射场实现室内多视角三维重建
- SPOJ 287 Smart Network Administrator
- Linux疑难杂症解决方案100篇(十)-带你学习提速增效的几个常用 shell 命令
- php的反射技术,PHP 反射使用
- Why docker command need sudo? | 为什么运行docker命令需要sudo?
- java_options字符串拼接_java8 StringJoiner拼接字符串
- [渝粤教育] 中国地质大学 金融保险业会计 复习题 (2)
- r语言做断轴_R语言用nls做非线性回归以及函数模型的参数估计
- 哪些事是你当了大学老师之后才知道的?
- Win7旗舰版电脑开机慢的解决方法
- java发送QQ群邮件,简单两步使用node发送qq邮件
- DataSet 添加数据集、行、列、主键和外键等操作示例
- python标准库math用法精要
- Netty学习总结(1)——Netty入门介绍
- VR游戏与传统游戏开发区别 和 Unite 2016关于VR/AR的消息
- HP M1136 USB 连接安装驱动 提示“新设备已连接” 解决方案
- 你离顶尖Java程序员,只差这11本书的距离 172 分享 分享到新浪微博 分享到QQ空间
- 电脑上的各个组合及功能键作用
- excel表格换行快捷键_常州办公excel表格常用技巧, 办公软件常用快捷键【金坛吧】...
- [深度学习]Part1 Python学习进阶Ch24图像处理OpenCV(24.1~24.13)——【DeepBlue学习笔记】