HttpServletRequestWrapper
Filter能在request到达servlet的服务方法之前拦截HttpServletRequest对象,而在服务方 法转移控制后又能拦截HttpServletResponse对象。
你可以使用filter来实现特定的任务,比如验证用户输入,以及压缩web内容。但HttpServletRequest对象的参数是不可改变的,这极大地缩减了filter的应用范围。至少在一半的时间里,你希望可以改变准备传送给 filter的对象。
幸运的是,尽管你不能改变不变对象本身,但你却可以通过使用装饰模式来改变其状态。
Example1:
一个删除空白字符的Filter
HttpServerletRequest装饰类
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; public final class MyRequestWrapper extends HttpServletRequestWrapper { public MyRequestWrapper(HttpServletRequest servletRequest) { super(servletRequest); } public String[] getParameterValues(String parameter) { String[] results = super.getParameterValues(parameter); if (results == null) { return null; } int count = results.length; String[] trimResults = new String[count]; for (int i = 0; i < count; i++) { trimResults[i] = results[i].trim(); } return trimResults; } }
如何载获Http请求并装饰HttpServletRequest对象
public class MyFilter implements Filter { private FilterConfig filterConfig; public void init(FilterConfig filterConfig) throws ServletException { System.out.println("Filter initialized"); this.filterConfig = filterConfig; } public void destroy() { System.out.println("Filter destroyed"); this.filterConfig = null; } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { chain.doFilter(new MyRequestWrapper((HttpServletRequest) request), response); } }
Example2:
通过HttpServletRequestWrapper(装饰模式的应用)来解决中文乱码问题
自定义请求包装器包装请求,将字符编码转换的工作添加到getParameter()方法中
mport java.io.UnsupportedEncodingException; import java.net.URLDecoder; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; public class GetHttpServletRequestWrapper extends HttpServletRequestWrapper { private String charset = "UTF-8"; public GetHttpServletRequestWrapper(HttpServletRequest request) { super(request); } /** * 获得被装饰对象的引用和采用的字符编码 * @param request * @param charset */ public GetHttpServletRequestWrapper(HttpServletRequest request, String charset) { super(request); this.charset = charset; } /** * 实际上就是调用被包装的请求对象的getParameter方法获得参数,然后再进行编码转换 */ public String getParameter(String name) { String value = super.getParameter(name); value = value == null ? null : convert(value); return value; } public String convert(String target) { System.out.println("编码转换之前:" + target); try { return new String(target.trim().getBytes("ISO-8859-1"), charset); } catch (UnsupportedEncodingException e) { return target; } } }
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { //设置请求响应字符编码 request.setCharacterEncoding(charset); response.setCharacterEncoding(charset); //新增加的代码 HttpServletRequest req = (HttpServletRequest)request; if(req.getMethod().equalsIgnoreCase("get")) { req = new GetHttpServletRequestWrapper(req,charset); } System.out.println("----请求被"+config.getFilterName()+"过滤"); //传递给目标servlet或jsp的实际上时包装器对象的引用,而不是原始的HttpServletRequest对象 chain.doFilter(req, response); System.out.println("----响应被"+config.getFilterName()+"过滤"); }
这样一来,在servlet中调用包装器的getParameters方法来获取参数,就已经完成了字符编码的转换过程,我们就不需要在每次获取参数时来进行字符编码转换了。
例子来源:http://www.iteye.com/topic/483158
相关推荐
这是一个关于HttpServletRequestWrapper使用的列子,工作需要,所以传上来的。
NULL 博文链接:https://rensanning.iteye.com/blog/1706208
NULL 博文链接:https://jiaguwen123.iteye.com/blog/714139
XssHttpServletRequestWrapper.java
输入转义 对用户输入的所有数据进行拦截,检测是否含有XSS攻击关键字,如果... 方法是实现一个自定义的 HttpServletRequestWrapper ,然后在 Filter 里面调用它,重写getParameter, getParameterValues 函数即可。
2,此Filter为真实项目部署,在XssHttpServletRequestWrapper.java文件中的cleanSqlKeyWords方法为具体的Xss拦截逻辑,可根根据自己的需要进行完善 3,服务器白名单为单独的一个工具包,在文章最后给出 4,文章开发...
2,此Filter为真实项目部署,在XssHttpServletRequestWrapper.java文件中的cleanSqlKeyWords方法为具体的Xss拦截逻辑,可根根据自己的需要进行完善 3,服务器白名单为单独的一个工具包,在文章最后给出 4,文章开发...
继承HttpServletRequestWrapper实现类,重新相关方法,实现自定义增加请求参数,通常是由于需要对参数进行特殊业务处理,然而HttpServletRequest的request.getPrameterMap是不允许修改的(被锁,可查看底层源码),...
request 对象是 HttpServletRequestWrapper 类的实例。它的继承体系如下: _request 对象继承层次... Servlet/JSP 中大量使用了接口而不是实现类,这恰恰就是面向接口编程的最佳应用啊。 request 内置对象是由 Tomcat
class MyRequest extends HttpServletRequestWrapper { public MyRequest(HttpServletRequest request) { super(request); } public String MyEncoding(String value) { String value1 = null; try...
Overview Package Class Tree Deprecated Index Help PREV NEXT FRAMES NO FRAMES A B C D E F G H I J L P R S U V -------------------------------------------------------------------------------- ...
对request请求进行拦截,对请求参数修改。常用于前台提交表单参数关键字的过滤。此工具可以对参数拦截并转义后提交到对应的处理类。 除了添加两个JsFilter.java和GetHttpServletRequestWrapper.java之外,需要在web....
class Request extends HttpServletRequestWrapper { public Request(HttpServletRequest request) { super(request); } public String toChi(String input) { try { byte[] bytes=...
J2EE 类库文档 ...HttpServletRequestWrapper HttpServletResponse HttpServletResponseWrapper HttpSession HttpSessionActivationListener HttpSessionAttributeListener HttpSessionBindingEvent ...
作用是保证指定时间(当前是2分钟)内请求不重复 sign:签名结果通用签名SDK源码+使用教程.zip通用签名SDK源码+使用教程.zip通用签名SDK源码+使用教程.zip通用签名SDK源码+使用教程.zip通用签名SDK源码+使用教程.zip...
javax.servlet.http.HttpServletRequestWrapper javax.servlet.ServletContextAttributeListener javax.servlet.ServletRequestAttributeListener javax.servlet.http.HttpServletResponseWrapper javax.servlet....
对项目中的所有参数去除前后空格过滤,统一处理参数!可以基于此过滤器实现过滤跨站脚本攻击,参数的增加,...实现原理为重写HttpServletRequestWrapper,获取参数的方法。include和 Forwarded 内部转发不在过滤之内。
直接获取需要满足条件的记录 <br/> 下面举了一个例子来说明使用方法: <br/>package org.hgg.hq.test; <br/>import java.util.ArrayList; import java.util.List; <br/>import javax....
javax.servlet.http.HttpServletRequestWrapper.class javax.servlet.http.HttpSessionActivationListener.class javax.servlet.http.HttpSessionListener.class javax.servlet.http.HttpUtils.class javax.servlet....