一.前言

由于业务需要,在网上找了很久得到了这两种方式。本文代码偏少,主要讲解一下怎么传,如何接收,也记录一下,以便之后查看。

二.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(目标方法)}

四.总结

  1. aop切面确实好用,降低了代码的耦合性,可以非常方便的在后期增加功能
  2. aop和拦截器都可以进行拦截,相当于都是拦截器
  3. 这样一个需求,在我这边主要是为了降低前端和后端的交互,以前前端需要传递一个参数过来,但是现在不用传递过来了,我直接在拦截器中或aop中进行手动添加参数,传递到controller。
    好像写的有点复杂了,如果大家有没有看懂的,或是有疑问的可以私聊我哟。(_),大家一起加油!加油!(。・∀・)ノ

spring拦截器传递传递参数到controller+Aop切面环绕方法传递参数到目标方法相关推荐

  1. Spring拦截器校验Json格式参数

    Json已经成为一种主流的数据传输格式,请求参数是整个RequestBody. 那么,拦截器中如何获取Json呢? 办法是:通过request.getInputStream. RequestBody是 ...

  2. Spring拦截器(Interceptor)的运用

    在以Spring为基础的框架(例如Spring boot, Spring MVC)中,会使用到一种名为拦截器的东西,它属于面向切面编程的架构模式,为我们在API调用前后做一些额外操作提供了便利. 如何 ...

  3. Java(Spring拦截器、过滤器、AOP)

    过滤器: 过滤器是servlet提供的API,需要实现javax.servlet.Filter接口.过滤器可以拦截到方法的请求和响应(ServletRequest request, SetvletRe ...

  4. Spring拦截器实现登录拦截

    hello,大家好,好久没发文章了,之前一段时间因为没遇到太好的内容.昨天研究了下登录时Spring拦截器实现功能,今天和大家分享下,有问题的话欢迎大家指出与批评,好,下面进入正题.    说起拦截器 ...

  5. 「深入源码」Spring拦截器的实现原理和执行机制

    我一直以为Spring的拦截器是基于AOP原理实现的,仔细阅读完源码,才知道自己的认知是错误的. 今天我们就从源码的角度剖析下Spring拦截器. 一.创建一个自己的拦截器 实现一个自己的拦截器,需要 ...

  6. Spring拦截器的实现以及通过注解实现拦截

    五 本篇是本人记录对于Spring的拦截器简单的使用记录,以及通过自定义注解的方式实现其拦截目的 首先看一下简单的实现 第一步:定义一个测试类,用于向后台发送请求 @RestController pu ...

  7. Spring拦截器的切入点定义

    Spring拦截器定义切入点: 1.NameMatchMethodPointcutAdvisor (根据方法名匹配织入)  <bean id="advisor" class= ...

  8. spring拦截器不生效

    在平时休闲时间做一个学习型项目练手,在练习过程中,遇到一个spring拦截器不生效的问题,拦截器代码如下: @Aspect // 该注解标示该类为切面类 @Component public class ...

  9. spring 两次进入拦截器_4.SpringBoot 拦截器Fliter,Interceptor,Controller……

    在项目的开发中,在某些情况下,我们需要对客户端发出的请求进行拦截,常用的API拦截方式有Fliter,Interceptor,ControllerAdvice以及Aspect. 上面的图是Spring ...

最新文章

  1. ICCV 2021 Oral | NerfingMVS:引导优化神经辐射场实现室内多视角三维重建
  2. SPOJ 287 Smart Network Administrator
  3. Linux疑难杂症解决方案100篇(十)-带你学习提速增效的几个常用 shell 命令
  4. php的反射技术,PHP 反射使用
  5. Why docker command need sudo? | 为什么运行docker命令需要sudo?
  6. java_options字符串拼接_java8 StringJoiner拼接字符串
  7. [渝粤教育] 中国地质大学 金融保险业会计 复习题 (2)
  8. r语言做断轴_R语言用nls做非线性回归以及函数模型的参数估计
  9. 哪些事是你当了大学老师之后才知道的?
  10. Win7旗舰版电脑开机慢的解决方法
  11. java发送QQ群邮件,简单两步使用node发送qq邮件
  12. DataSet 添加数据集、行、列、主键和外键等操作示例
  13. python标准库math用法精要
  14. Netty学习总结(1)——Netty入门介绍
  15. VR游戏与传统游戏开发区别 和 Unite 2016关于VR/AR的消息
  16. HP M1136 USB 连接安装驱动 提示“新设备已连接” 解决方案
  17. 你离顶尖Java程序员,只差这11本书的距离 172 分享 分享到新浪微博 分享到QQ空间
  18. 电脑上的各个组合及功能键作用
  19. excel表格换行快捷键_常州办公excel表格常用技巧, 办公软件常用快捷键【金坛吧】...
  20. [深度学习]Part1 Python学习进阶Ch24图像处理OpenCV(24.1~24.13)——【DeepBlue学习笔记】

热门文章

  1. 数字电位器程控可调电阻IC
  2. 最新!2020中国高校毕业生薪资排行出炉!
  3. 大数据技术之Flume(一)Flume概述、Flume快速入门
  4. 小程序系统API调用
  5. 云大计算机应用技术考研2021,2021云南大学考研经验贴
  6. Veins文档(中文)
  7. jetson xavier nx 系统及相关环境配置(cuda,torchvision,torch,tensorflow,opencv)
  8. android framework实战车机手机系统开发环境相关问题补充
  9. 安全环保专题培训考试题
  10. 【线性代数】线性相关与线性无关的定义与性质