前言:

这两天开发遇到一个需求,那就是在后台接收到请求后,能不能自定义添加参数呢?

我们知道request中是能获取到前端获取的参数的,但是在后端不能再往parameter中添加参数了,虽然可以使用request.setAttribute()方法往request中存放数据,但是这些数据springmvc在解析request中的数据时是不会解析的;

而且,如果我们想对前端传来的数据做处理这个方法也是无法实现的,我查看了一下网上的资料,并没有发现springmvc有预留这样的接口可以扩展,所以,我就考虑自己来处理一下它吧;

1,先找到springmvc是如何获取参数的

首先,要找到springmvc是在哪获取参数的,于是我们通过debug模式查找一次请求中,参与处理的类有哪些,终于,我们找到了这样一个类:org.springframework.web.util.WebUtil,这个类中有这样一个方法:

public static MapgetParametersStartingWith(ServletRequest request, @Nullable String prefix) {

Assert.notNull(request,"Request must not be null");

Enumeration paramNames =request.getParameterNames();

Map params = new TreeMap<>();if (prefix == null) {

prefix= "";

}while (paramNames != null &&paramNames.hasMoreElements()) {

String paramName=paramNames.nextElement();if ("".equals(prefix) ||paramName.startsWith(prefix)) {

String unprefixed=paramName.substring(prefix.length());

String[] values=request.getParameterValues(paramName);if (values == null || values.length == 0) {//Do nothing, no values found at all.

}else if (values.length > 1) {

params.put(unprefixed, values);

}else{

params.put(unprefixed, values[0]);

}

}

}returnparams;

}

springmvc就是使用这个方法获取到request中所有的参数,那么有读者就问了,直接重写一下这个方法不就得了,问题就解决啦;然而我得说,如果我们还想继续用springmvc,那么就不要这么想,因为调用这个方法是这样调用得:

1 publicServletRequestParameterPropertyValues(2 ServletRequest request, @Nullable String prefix, @Nullable String prefixSeparator) {3

4 super(WebUtils.getParametersStartingWith(5 request, (prefix != null ? prefix + prefixSeparator : null)));6 }

调用WebUtils类得位置

这是一个静态方法,因此也不需要声明实例,所以我们没办法自己重写WebUtils类以后再交由这个类来调用,因此我们要找到可以注入得地方下手来做这件事,所以我就开始找,过程走了不少得弯路,终于,我找到了啦!

2,所有扩展得类(ps:我是使用得@requestMapping来处理的http请求,如果是其他方式,请自行去继承相应的adapter就可以的)

(1)创建一个RequestMappingHandlerAdapter类的子类,并且交给spring去管理,这样才能把这个类注册到dispatchServlet中作为适配器使用

1 @Component2 public class MyRequestMappingHandlerAdapter extendsRequestMappingHandlerAdapter {3

4 protectedServletInvocableHandlerMethod createInvocableHandlerMethod(HandlerMethod handlerMethod) {5 return newMyServletInvocableHandlerMethod(handlerMethod);6 }7

8 protected InitBinderDataBinderFactory createDataBinderFactory(ListbinderMethods)9 throwsException {10

11 return newMyWebDataBinderFactory(binderMethods, getWebBindingInitializer());12 }13 }

MyRequestMappingHandlerAdapter

(2)创建一个ServletRequestDataBinderFactory类的子类

1 public class MyWebDataBinderFactory extendsServletRequestDataBinderFactory {2 /**

3 * Create a new instance.4 *5 *@parambinderMethods one or more {@code@InitBinder} methods6 *@paraminitializer provides global data binder initialization7 */

8 public MyWebDataBinderFactory(ListbinderMethods, WebBindingInitializer initializer) {9 super(binderMethods, initializer);10 }11

12 @Override13 protectedServletRequestDataBinder createBinderInstance(14 @Nullable Object target, String objectName, NativeWebRequest request) throwsException {15

16 return newMyExtendedServletRequestDataBinder(target, objectName);17 }18 }

MyServletRequestDataBinderFactory

(3)创建一个ExtendedServletRequestDataBinder类的子类

1 public class MyExtendedServletRequestDataBinder extendsExtendedServletRequestDataBinder {2

3

4 publicMyExtendedServletRequestDataBinder(Object target, String objectName) {5 super(target, objectName);6 }7

8 public voidbind(ServletRequest request) {9 MutablePropertyValues mpvs = newServletRequestParameterPropertyValues(request);10 ((Consumer)request.getAttribute(WebConfig.DEFAULT_PARAM_NAME)).accept(mpvs);11 MultipartRequest multipartRequest = WebUtils.getNativeRequest(request, MultipartRequest.class);12 if (multipartRequest != null) {13 bindMultipart(multipartRequest.getMultiFileMap(), mpvs);14 }15 addBindValues(mpvs, request);16 doBind(mpvs);17 }18 }

MyExtendedServletRequestDataBinder

(4)创建一个注册拦截器的配置类WebMvcConfigurer的子类用来注册拦截器

1 @Configuration2 public class WebConfig implementsWebMvcConfigurer {3

4

5 public final static String DEFAULT_PARAM_NAME = "paramDealFunction";6

7 @Autowired8 privatePageInterceptor pageInterceptor;9

10

11 public voidaddInterceptors(InterceptorRegistry registry) {12 //注册自定义拦截器,添加拦截路径和排除拦截路径

13 registry.addInterceptor(pageInterceptor).addPathPatterns("/**/page");14 }15

16 @Bean(name =DispatcherServletAutoConfiguration.DEFAULT_DISPATCHER_SERVLET_BEAN_NAME)17 publicDispatcherServlet getDis(){18 return newMyDispatcherServlet();19 }20 }

WebConfig

(5)创建一个拦截器HandlerInterceptor的子类

1 @Component2 public class PageInterceptor implementsHandlerInterceptor {3

4

5 @Override6 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throwsException {7 Consumer function = (MutablePropertyValues mpvs) -> mpvs.addPropertyValue("pageStart",mpvs.get("pageNumber"));8 request.setAttribute(WebConfig.DEFAULT_PARAM_NAME, function);9 return true;10 }11

12 }

View Code

总结一下所有的工作的目的:

(1)设计这个MyRequestMappingHandlerAdapter是为了重写createDataBinderFactory,也就是重新注入DataBinderFactory;

(2)设计这个MyWebDataBinderFactory是为了重写createBinderInstance方法,也就是重新注入一个ServletRequestDataBinder;

(3)设计这个MyExtendedServletRequestDataBinder是为了重写bind方法,为了实现可以自定义处理参数;

其实这三个方法重写已经可以实现了对参数的自定义处理,但是为了和springmvc拦截器整合,所以有新加了pageInterceptor和WebConfig两个类;

好了,创建好这几个类以后,你就可以在PageInterceptor中自行根据业务需求去处理参数啦!如果不关心是怎么找到这个方法的读者可以去改造上面的代码啦

下面上干货,记录我是如何找到这个方法去处理参数的,也是整理一下我自己的思路;

3,整个分析的过程记录

(1)毕竟springmvc还是特别好用的,我还是希望在不影响它任何功能的情况下实现这个处理参数的目的,我发现了实际处理参数的类,改造这个方法是最好的:

然后我找到了调用这个方法的方法,发现是直接调用的,别人的代码不能改,毕竟支持扩展,避免修改

于是找谁调用的这个方法,一定要直到找到可以注入的地方为止,发现下main这个方法就是调的本类的方法,没有用,继续找;

我发现下面这个方法是通过new出来的ServletRequestParameterPropertyValues对象进行获取数据的,哎呀,如果这个地方是可以自定义注入的话,那问题就解决啦,注入一个自定义的子类,然后在这个子类中添加自定义参数的方法,就没问题啦,

By © 2017 likecs 版权所有.

粤ICP备12038626号-2

Powered By WordPress . Theme by Luju

springmvc拦截器对请求参数解密_springMvc使用拦截器自定义处理参数相关推荐

  1. 【Java从零到架构师第③季】【26】SpringMVC-反射获取方法参数名_SpringMVC是如何获取方法的参数名的

    持续学习&持续更新中- 守破离 [Java从零到架构师第③季][26]SpringMVC-反射获取方法参数名_SpringMVC是如何获取方法的参数名的 利用反射获取方法的参数名 直接编译 修 ...

  2. springmvc拦截器对请求参数解密_SpringMVC拦截器如何修改请求参数

    拦截器1,基本拦截器: package cn.ijava.interceptor; import javax.servlet.http.HttpServletRequest; import javax ...

  3. Validator 参数校验springboot整合Validator,自定义手机号参数校验

    https://blog.csdn.net/m0_46425463/article/details/108006414

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

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

  5. layui上传文件请求接口异常_SpringMVC实现文件上传与下载,拦截器,异常处理

    第一章:响应数据和结果视图 1. 返回字符串 Controller方法返回字符串可以指定逻辑视图的名称,根据视图解析器为物理视图的地址. @RequestMapping(value="/he ...

  6. 拦截器获取请求参数post_「SpringBoot WEB 系列」RestTemplate 之自定义请求头

    [WEB 系列]RestTemplate 之自定义请求头 上一篇介绍了 RestTemplate 的基本使用姿势,在文末提出了一些扩展的高级使用姿势,本篇将主要集中在如何携带自定义的请求头,如设置 U ...

  7. springmvc重定向到另一个项目_SpringMVC结合Ajax、请求转发重定向、视图解析器

    每日总结 一.Spring结合Ajax的处理方式 1.传统解决方案 直接输出 2.使用SpringMVC框架提供的处理方法 注意: A.方法的返回值可以是对象或者集合 B.响应给前台的数据直接是jso ...

  8. 如何使用Mybatis的拦截器实现数据加密与解密

    点击蓝色"程序猿DD"关注我哟 加个"星标",不忘签到哦 转载自公众号:日拱一兵 关注我,回复口令获取可获取独家整理的学习资料: - 001 :领取<Sp ...

  9. java元婴期(31)----java进阶(springmvc(5)---数据回显数据交互拦截器)

    数据回显 什么数据回显 提交后,如果出现错误,将刚才提交的数据回显到刚才的提交页面. pojo数据回显方法 1.springmvc默认对pojo数据进行回显. pojo数据传入controller方法 ...

最新文章

  1. 关于hibernate的实体类中有集合类型转化成JSON的工具类 - 怀念今天的专栏 - 博客频道...
  2. 计算机考试单元格,计算机等级考试技巧在Excel中如何对单元格进行设置?
  3. JVM发生OOM的 8 种原因、及解决办法
  4. ChromeDriver与chrome对应关系
  5. 【飞控理论】从零开始学习Kalman Filters之二:最优状态估计、最优估计算法和方程
  6. 瑞士信贷上调苹果目标价至168美元
  7. realme真我GT2系列节后登场:出厂自带realme UI 3.0正式版
  8. 自己动手写Docker系列 -- 5.5实现容器停止
  9. 函数在区间连续可以推出什么_A-22 函数的点连续、单侧连续、区间连续
  10. IIS5IIS6IIS7的ASP.net 请求处理过程比较(转)
  11. 【语言处理与Python】9.2处理特征结构\9.3扩展基于特征的文法
  12. JavaEE学习14(应用)--用户自动登陆
  13. 一元一次方程用计算机怎么解,一元一次方程怎么解 [解一元一次方程的基本步骤]...
  14. 湘潭大学2022软件工程程序设计实践平时练习二C/C++
  15. 金仓数据库 KingbaseES SQL 语言参考手册 (14. SQL语句:COMMIT 到 CREATE LANGUAGE)
  16. debian9.6安装TAO过程
  17. 服务器 系统做镜像,服务器系统做镜像
  18. 【性能测试】Jmeter性能测试实战
  19. 编写程序描述影视歌三栖艺人
  20. 银行卡卡号格式规范 每隔4为一个空格

热门文章

  1. 警惕!MySQL成数据勒索新目标
  2. 中国嵌入式模具封装市场趋势报告、技术动态创新及市场预测
  3. 实习半个月----之学以致用
  4. 浅谈游戏开发之2D手游工具
  5. 武汉星起航:深度剖析个人卖家在亚马逊上开店的流程
  6. 质谱高级数据分析工具
  7. 函数论_E.C.Tichmarsh_Page 4 例题 iii 狄利克雷级数一致收敛
  8. LiveGBS流媒体平台GB/T28181常见问题-海康大华宇视监控摄像机NVR硬件设备注册不上来如何排查?
  9. Udacity Self-Driving 目标检测数据集简介与使用
  10. mac安装thinkcmf6