继承HttpServletRequestWrapper以实现在Filter中修改HttpServletRequest的参数
来源:互联网 发布:mac环境变量在哪 编辑:程序博客网 时间:2024/05/23 23:33
一 简介
如题所示,有时候我们需要在一个请求到达Controller之前能够截获其请求,并且根据其具体情况对 HttpServletRequest 中的参数进行过滤或者修改。这时,有的同学可能会想:我们是否可以在一个Filter中将 HttpServletRequest 里的所有参数都取出来分别进行过滤然后再放回到该HttpServletRequest 中呢?
很显然,在 HttpServletRequest 貌似只有 setAttribute(String name, Object o) 这个方法可以设置参数,但是我们经过尝试之后可以发现:使用 setAttribute(String name, Object o) 方法来重新设置参数显然是不行的,因为在Controller中获取参数本质上还是调用的ServletRequest的public String getParameter(String name) 或者 public String[] getParameterValues(String name) 方法,因此想要达到“在Filter中修改HttpServletRequest的参数”的目的,显然是需要使用装饰模式来复写这些方法才行的
在正式代码之前,我还是先简单介绍下ServletRequest、HttpServletRequest、ServletRequestWrapper以及HttpServletRequestWrapper这几个接口或者类之间的层次关系,并说明“继承HttpServletRequestWrapper类以实现在Filter中修改HttpServletRequest的参数”这种方式的原理是什么
如果我们从网上下载tomcat的源代码并查看的话,就可以很清楚地看到这几个类之间的层次关系了,在eclipse中看,它们之间的层次关系是这样的:
如果这个图表还不够清楚地话,我还画了一个简单的UML结构图:
注:因为我现在没有下载专门的UML建模工具,因此就使用“画图”工具简单地画了一下类图,同时这里的ModifyParametersWrapper 是我后面举例用到的的一个自定义的类
如果学过“装饰模式”的童鞋可能已经发现了,上面这个关系毫无疑问是一个很标准的装饰模式:
- ServletRequest 抽象组件
- HttpServletRequest 抽象组件的一个子类,它的实例被称作“被装饰者”
- ServletRequestWrapper 一个基本的装饰类,这里是非抽象的
- HttpServletRequestWrapper 一个具体的装饰者,当然这里也继承了HttpServletRequest这个接口,是为了获取一些在ServletRequest中没有的方法
- ModifyParametersWrapper 同样是 一个具体的装饰者(PS:我自定义的一个类)
注:一个标准的装饰模式的UML类图是这样的:
那么问题来了,如何在Filter中修改后台Controller中获取到的HttpServletRequest中的参数?
答:很简单,只需要在Filter中自定义一个类继承于HttpServletRequestWrapper,并复写getParameterNames、getParameter、getParameterValues等方法即可
二 代码实现
(1)自定义的过滤器ModifyParametersFilter.java:
上面的代码很简单,就是添加了一个内部类:ModifyParametersWrapper,然后复写了ServletRequest中的几个方法,具体来说就是将原来的每个参数的值的前面加上了“Modified: ”这个字符串
(2)在web.xml中注册该过滤器:
(3)添加一个测试使用的Controller,即:TestModifyController.java:
这里没有处理复杂的逻辑,仅仅只是简单地输出
(4)测试:
启动项目之后访问:http://localhost:9180/FilterDemo/param/modify.html?name=abc
可以发现,在控制台中输出如下:
这就表明了我们前面自定义的过滤器已经将HttpServletRequest中原来的参数成功修改了。同时,还说明SpringMVC的@RequestParam注解本质上调用的是ServletRequest中的 getParameterValues(String name) 方法而不是 getParameter(String name) 方法
注:tomcat-8.5.5源码下载地址:http://pan.baidu.com/s/1skWOso9
- 继承HttpServletRequestWrapper以实现在Filter中修改HttpServletRequest的参数
- 继承HttpServletRequestWrapper以实现在Filter中修改HttpServletRequest的参数
- 关于在struts2中interceptor 中使用ActionInvocation 对象获得HttpServletRequest中封装的参数,以Map的形式
- 在filter中修改request参数
- 修改HttpServletRequest的参数【转】
- 修改HttpServletRequest的参数【转】
- 继承HttpServletRequestWrapper 实现request中流的重复获取
- HttpServletRequestWrapper,HttpServletResponseWrapper在过滤器Filter中的使用
- 修改HttpServletRequest的中的参数值
- Struts2 Filter 和 HttpServletRequestWrapper出现的问题
- HttpServletRequestWrapper Filter中装饰Request 解决全站编码问题!
- 在Filter中获取web.xml中配置的参数
- 在HttpServletRequest request获得参数,通过类的set方法封装到对象中
- 利用HttpServletRequestWrapper和filter改变request的getParameter方法
- 在filter中获取action的参数值
- 在Android中,可以自定义类,继承ViewGroup等容器类,以实现自己需要的布局显示。
- 通过HttpServletRequestWrapper(装饰模式的应用)增强HttpServletRequest的功能
- 通过HttpServletRequestWrapper(装饰模式的应用)增强HttpServletRequest的功能解决乱码
- Tensorflow-简介
- 基于matlab的DTMF信号的产生和检测(2)
- HDU 1896:Stones(优先队列)
- CMD( 三)操作详解
- NYOJ 216 A problem is easy
- 继承HttpServletRequestWrapper以实现在Filter中修改HttpServletRequest的参数
- pythonWeb -- Django开发-模板 自带的模板哦
- 去掉Sublime text 3中的框框
- ZOJ-3765 Lights(Splay树)
- 平方和与立方和 oj95
- H.265帧内预测技术
- 统计文件中每个字母的个数
- 栈帧
- vim 常用快捷键