`
uule
  • 浏览: 6359229 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

HttpServletRequestWrapper 用法

 
阅读更多

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在filter修改request参数”揭示了主要知识点,即如何在过滤器中通过自定义`HttpServletRequestWrapper` 子类来动态改变请求参数。这通常用于处理如数据验证、安全过滤、参数转换...

    HttpServletRequestWrapper应用(二):包装文件上传请求

    然而,如果我们需要在上传过程中做一些额外的操作,如验证文件类型、大小限制等,可以创建一个继承自`HttpServletRequestWrapper`的子类,并覆盖相关的方法。 以下是一个简单的例子,展示如何创建一个`...

    Request中的参数转实体类

    主要用于使用Request中的getParamterMap()方法生成一个实体类,其中还包括getParamterMap中字段的检查方法。详见内容!

    springboot 解决InputStream只能读取一次的问题

    在Spring Boot中,我们可以使用`ServletRequestWrapper`或`HttpServletRequestWrapper`来解决这个问题。`ServletRequestWrapper`是Spring对Servlet规范中的`HttpServletRequest`接口的包装类,它允许我们对原始请求...

    J2EE资源练习多选

    3. **修改`getReader`方法的行为限制**:`HttpServletRequestWrapper`的子类不能修改`getReader`方法的行为。这是不正确的,子类可以通过覆盖`getReader`方法来自定义其行为。 4. **使用范围的限制**:`...

    防范XSS攻击程序

    输入转义 对用户输入的所有数据进行拦截,检测是否含有XSS攻击关键字,如果... 方法是实现一个自定义的 HttpServletRequestWrapper ,然后在 Filter 里面调用它,重写getParameter, getParameterValues 函数即可。

    jsp中获得路径的两种方法和获得url路径的方法(推荐).docx

    然而,`request.getRealPath("/")`方法虽然可以获取到服务器上JSP文件的实际物理路径,如`d:\web\`,但这个方法在现代的Java Web应用中已经不再推荐使用,因为它依赖于服务器的文件系统,这在分布式和容器化的环境中...

    Killtest 免费提供 310-084 最新资料下载

    - **Filter接口下的使用**:虽然`HttpServletRequestWrapper`可以由任何需要修改请求的对象使用,但在Servlet过滤器(实现`javax.servlet.Filter`接口的类)中特别有用,因为过滤器通常需要修改或检查请求和响应。...

    完美解决request请求流只能读取一次的问题

    解决request请求流只能读取一次的问题,我们可以使用自定义的HttpServletRequestWrapper,覆写getInputStream()和getReader()方法,从而实现流的重复读取。这可以在SpringBoot项目中使用Filter拦截器对所有请求流中...

    使用Filter针对Xss攻击,sql注入,服务器访问白名单,以及csrf进行安全校验

    2,此Filter为真实项目部署,在XssHttpServletRequestWrapper.java文件中的cleanSqlKeyWords方法为具体的Xss拦截逻辑,可根根据自己的需要进行完善 3,服务器白名单为单独的一个工具包,在文章最后给出 4,文章开发...

    主要使用Filter针对Xss攻击,sql注入,服务器访问白名单,以及csrf进行安全校验

    2,此Filter为真实项目部署,在XssHttpServletRequestWrapper.java文件中的cleanSqlKeyWords方法为具体的Xss拦截逻辑,可根根据自己的需要进行完善 3,服务器白名单为单独的一个工具包,在文章最后给出 4,文章开发...

    java修改请求参数

    在`doFilter()`方法中,可以读取原始请求参数,进行修改,然后使用`HttpServletRequestWrapper`包装修改后的参数,再继续请求链。 3. **处理逻辑内修改**:如果修改参数的逻辑比较单一,也可以选择在具体处理请求的...

    在使用实现过滤器进行request包装,获取内层request的分析

    这时,我们可以使用`HttpServletRequestWrapper`类来包装请求,并在需要时获取内层的原始请求。下面是一个简单的例子: ```java public class OriginalRequestWrapper extends HttpServletRequestWrapper { ...

    RemoveSpace.rar

    在上述代码中,我们创建了一个`HttpServletRequestWrapper`子类,重写了`getParameterValues()`和`getParameter()`方法,以便在获取参数值时自动去除空格。 接下来,需要在Spring配置文件(如`applicationContext....

    详解JSP 内置对象request常见用法

    本文将详细讲解JSP内置对象`request`的常见用法。 首先,`request`对象是`HttpServletRequestWrapper`类的实例,它是`ServletRequest`接口的一个实现。`HttpServletRequest`是`ServletRequest`的唯一子接口,而`...

    java filter打印请求返回参数

    1. **对`HttpServletRequest`进行封装**:通过创建`HttpServletRequestWrapper`子类来包装原始请求对象,并重写`getReader()`和`getInputStream()`方法来读取请求体数据。 2. **对`HttpServletResponse`进行封装**...

    spring security获取用户信息的实现代码

    我们讨论了如何在Spring Security中获取用户信息的实现代码,包括借鉴现有的Spring Security Controller自动注入参数的方法、解决默认HttpServletRequest的限制、实现HttpServletRequestWrapper和使用Filter替换原来...

    java 获取request中的请求参数代码详解

    在 Java 中,我们可以使用 `request.getParameterNames()` 方法来获取所有的请求参数名,然后遍历这些参数名,使用 `request.getParameter(key)` 方法来获取对应的参数值。 ```java String[] parameterNames = ...

    Web开发 乱码过滤器.zip

    `EncodingFilter`可能会实现`javax.servlet.Filter`接口,重写`doFilter()`方法,并使用`ServletRequest#setCharacterEncoding()`来设置请求的字符编码,同时可能也会设置响应的编码,以确保返回给客户端的内容也...

Global site tag (gtag.js) - Google Analytics