2012-07-25 48 views
3

我需要刪除/修改一些HttpServletRequest參數。我試圖通過使用Filter基於我前幾天發佈的question來實現。用Servlet修改HttpServletRequest參數過濾器似乎沒有工作

Filter中,我試圖通過繼承HttpServletRequestWrapper類來包裝HttpServletRequest,如下所示。

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「)。我在這裏錯過了什麼?我是否以錯誤的方式?

順便說一下,在整個應用程序中始終如一地創建/使用請求屬性似乎不是最好的解決方案

[I需要刪除/修改請求參數春季MVC控制器類內,而不是內Filter本身]

+0

必須創建一個新的請求實例,設置值然後轉發它。 – Alfabravo 2012-07-25 21:56:59

回答

4

你remove方法修改由getParameterMap()返回的可變圖。但下一次調用getParameterMap()會重新構建一個包含包裝查詢的所有參數的新可變映射。

當構建FilteredRequest時應構建可變映射,並且它應該存儲在實例字段中。