HttpServletRequestWrapper 是什么

HttpServletRequestWrapper是一个Servlet API提供的HttpServletRequest的包装器,它允许开发人员在HttpServletRequest的请求和响应中添加额外的功能。

HttpServletRequestWrapper实现了HttpServletRequest接口,可以通过继承HttpServletRequestWrapper类来扩展HttpServletRequest的功能。它提供了一些常用的方法,例如getParameter()、getParameterNames()、getParameterValues()等,这些方法的实现委托给了原始的HttpServletRequest对象。

除了提供HttpServletRequest的基本功能外,HttpServletRequestWrapper还提供了一个受保护的成员变量request,它存储了原始的HttpServletRequest对象。通过这个成员变量,我们可以访问HttpServletRequest的所有属性和方法,并在其基础上添加自己的功能。

流程

通常情况下,HttpServletRequestWrapper是由Servlet容器在接收到请求后自动创建的,并在请求的处理过程中自动使用。具体来说,当一个请求到达Servlet容器时,Servlet容器会首先创建一个HttpServletRequest对象,然后将请求信息填充到该对象中,并将该对象作为参数传递给对应的Servlet的service()方法进行处理。在这个过程中,如果我们在web.xml文件中配置了Filter或者使用了Spring MVC等框架,这些组件可以通过实现Filter或者Interceptor来拦截请求并对其进行处理。其中,Filter或者Interceptor可以获取到HttpServletRequest对象,并且可以使用HttpServletRequestWrapper对其进行包装或者修改,然后再将修改后的HttpServletRequest对象传递给后续的处理程序。

在上述过程中,如果存在Filter或者Interceptor对HttpServletRequest对象进行了包装,那么在Servlet容器将该对象传递给Servlet的service()方法进行处理时,实际上传递的是包装后的HttpServletRequestWrapper对象。这样,我们就可以在包装对象中添加额外的功能或者修改请求参数,并且可以在后续的处理中使用修改后的请求参数。

public class CustomHttpServletRequestWrapper extends HttpServletRequestWrapper {
    private final Map<String, String[]> modifiedParameters;

    public CustomHttpServletRequestWrapper(HttpServletRequest request) {
        super(request);
        modifiedParameters = new HashMap<>(request.getParameterMap());
    }

    @Override
    public String getParameter(String name) {
        String[] values = modifiedParameters.get(name);
        if (values != null && values.length > 0) {
            return values[0];
        } else {
            return null;
        }
    }

    @Override
    public Map<String, String[]> getParameterMap() {
        return Collections.unmodifiableMap(modifiedParameters);
    }

    @Override
    public Enumeration<String> getParameterNames() {
        return Collections.enumeration(modifiedParameters.keySet());
    }

    @Override
    public String[] getParameterValues(String name) {
        return modifiedParameters.get(name);
    }

    public void addParameter(String name, String value) {
        String[] values = modifiedParameters.get(name);
        if (values == null) {
            values = new String[0];
        }
        String[] newValues = Arrays.copyOf(values, values.length + 1);
        newValues[values.length] = value;
        modifiedParameters.put(name, newValues);
    }
}
public class CustomFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        CustomHttpServletRequestWrapper wrapper = new CustomHttpServletRequestWrapper(httpServletRequest);
        wrapper.addParameter("name", "John");
        chain.doFilter(wrapper, response);
    }
}
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐