使用Servlet过滤器修改HttpServletRequest参数似乎不起作用

时间:2012-07-25 21:54:56

标签: jsp servlets

我需要删除/修改一些HttpServletRequest参数。我尝试使用基于我几天前发布的questionFilter来尝试这样做。

Filter中,我试图通过继承HttpServletRequest类来包装HttpServletRequestWrapper,如下所示。

private final static class FilteredRequest extends HttpServletRequestWrapper {

    public FilteredRequest(ServletRequest request) {
        super((HttpServletRequest) request);
    }

    @Override
    public String getParameter(String paramName) {
        return super.getParameter(paramName);
    }

    @Override
    public String[] getParameterValues(String paramName) {
        return super.getParameterValues(paramName);
    }

    @Override
    public Map getParameterMap() {
        Map<Object, Object> parameterMap = new HashMap<Object, Object>();
        Map originalParameterMap = super.getParameterMap();

        for (Object o : originalParameterMap.entrySet()) {
            Map.Entry<Object, Object> pairs = (Entry<Object, Object>) o;
            parameterMap.put(pairs.getKey(), pairs.getValue());
        }
        return parameterMap;  //Returning a modifiable ParameterMap.
    }
}

它是Filter类中的内部类。在doFilter()方法中,

chain.doFilter(new FilteredRequest(request), (HttpServletResponse)response);

正在调用上述类的构造函数(包装请求)。


现在,我希望在我的Spring MVC控制器类中修改/取消设置任何请求参数。我正在尝试删除控制器类中的参数,如下所示。

Map requestMap=request.getParameterMap();
requestMap.remove("txt_country_name");

或者,

requestMap.put("txt_country_name", null);

因此,请求参数txt_country_name应该从HttpServletRequest中删除,但不会被删除(也不会抛出任何异常,例如“不允许修改锁定的ParameterMap “)。我在这里错过了什么?我是否采取了错误的方式?

顺便说一句,在整个应用程序中始终制作/使用请求属性似乎不是最佳解决方案

[我需要删除/修改Spring MVC控制器类中的请求参数 而不是Filter本身]

1 个答案:

答案 0 :(得分:4)

您的remove方法会修改getParameterMap()返回的可变映射。但是下一次调用getParameterMap()会重新构建一个包含所有包装查询参数的可变映射。

构造FilteredRequest时应构建可变映射,并将其存储在实例字段中。