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在filter修改request参数”揭示了主要知识点,即如何在过滤器中通过自定义`HttpServletRequestWrapper` 子类来动态改变请求参数。这通常用于处理如数据验证、安全过滤、参数转换...
然而,如果我们需要在上传过程中做一些额外的操作,如验证文件类型、大小限制等,可以创建一个继承自`HttpServletRequestWrapper`的子类,并覆盖相关的方法。 以下是一个简单的例子,展示如何创建一个`...
主要用于使用Request中的getParamterMap()方法生成一个实体类,其中还包括getParamterMap中字段的检查方法。详见内容!
在Spring Boot中,我们可以使用`ServletRequestWrapper`或`HttpServletRequestWrapper`来解决这个问题。`ServletRequestWrapper`是Spring对Servlet规范中的`HttpServletRequest`接口的包装类,它允许我们对原始请求...
3. **修改`getReader`方法的行为限制**:`HttpServletRequestWrapper`的子类不能修改`getReader`方法的行为。这是不正确的,子类可以通过覆盖`getReader`方法来自定义其行为。 4. **使用范围的限制**:`...
输入转义 对用户输入的所有数据进行拦截,检测是否含有XSS攻击关键字,如果... 方法是实现一个自定义的 HttpServletRequestWrapper ,然后在 Filter 里面调用它,重写getParameter, getParameterValues 函数即可。
然而,`request.getRealPath("/")`方法虽然可以获取到服务器上JSP文件的实际物理路径,如`d:\web\`,但这个方法在现代的Java Web应用中已经不再推荐使用,因为它依赖于服务器的文件系统,这在分布式和容器化的环境中...
- **Filter接口下的使用**:虽然`HttpServletRequestWrapper`可以由任何需要修改请求的对象使用,但在Servlet过滤器(实现`javax.servlet.Filter`接口的类)中特别有用,因为过滤器通常需要修改或检查请求和响应。...
解决request请求流只能读取一次的问题,我们可以使用自定义的HttpServletRequestWrapper,覆写getInputStream()和getReader()方法,从而实现流的重复读取。这可以在SpringBoot项目中使用Filter拦截器对所有请求流中...
2,此Filter为真实项目部署,在XssHttpServletRequestWrapper.java文件中的cleanSqlKeyWords方法为具体的Xss拦截逻辑,可根根据自己的需要进行完善 3,服务器白名单为单独的一个工具包,在文章最后给出 4,文章开发...
2,此Filter为真实项目部署,在XssHttpServletRequestWrapper.java文件中的cleanSqlKeyWords方法为具体的Xss拦截逻辑,可根根据自己的需要进行完善 3,服务器白名单为单独的一个工具包,在文章最后给出 4,文章开发...
在`doFilter()`方法中,可以读取原始请求参数,进行修改,然后使用`HttpServletRequestWrapper`包装修改后的参数,再继续请求链。 3. **处理逻辑内修改**:如果修改参数的逻辑比较单一,也可以选择在具体处理请求的...
这时,我们可以使用`HttpServletRequestWrapper`类来包装请求,并在需要时获取内层的原始请求。下面是一个简单的例子: ```java public class OriginalRequestWrapper extends HttpServletRequestWrapper { ...
在上述代码中,我们创建了一个`HttpServletRequestWrapper`子类,重写了`getParameterValues()`和`getParameter()`方法,以便在获取参数值时自动去除空格。 接下来,需要在Spring配置文件(如`applicationContext....
本文将详细讲解JSP内置对象`request`的常见用法。 首先,`request`对象是`HttpServletRequestWrapper`类的实例,它是`ServletRequest`接口的一个实现。`HttpServletRequest`是`ServletRequest`的唯一子接口,而`...
1. **对`HttpServletRequest`进行封装**:通过创建`HttpServletRequestWrapper`子类来包装原始请求对象,并重写`getReader()`和`getInputStream()`方法来读取请求体数据。 2. **对`HttpServletResponse`进行封装**...
我们讨论了如何在Spring Security中获取用户信息的实现代码,包括借鉴现有的Spring Security Controller自动注入参数的方法、解决默认HttpServletRequest的限制、实现HttpServletRequestWrapper和使用Filter替换原来...
在 Java 中,我们可以使用 `request.getParameterNames()` 方法来获取所有的请求参数名,然后遍历这些参数名,使用 `request.getParameter(key)` 方法来获取对应的参数值。 ```java String[] parameterNames = ...
`EncodingFilter`可能会实现`javax.servlet.Filter`接口,重写`doFilter()`方法,并使用`ServletRequest#setCharacterEncoding()`来设置请求的字符编码,同时可能也会设置响应的编码,以确保返回给客户端的内容也...