2010-10-15 37 views
8

我有一種情況,我需要重定向我的HTTP請求對象到其他控制器/類進行進一步處理。問題是,在某些控制器中,我希望更好地控制轉發給下一個類的參數:修改,編輯,刪除它們。所以,我想知道是否有一個很好的練習/模式來實現HTTP請求參數的基本控制。在控制器/類中刪除HttpServletRequest參數的最佳方法?

回答

17

好的做法是使用servlet過濾器將請求對象包裝在另一個對象中。由於HttpServletRequest是一個接口,您可以編寫自己的實現。您的實現可以保存您收到的請求,並將任何和所有自己的方法委託給原始請求對象,但也可以根據需要修改返回值。因此,您的getParameter()等方法可以調用原始請求對象上的相同方法,並在返回之前按照您認爲合適的方式修改結果。

class MyHttpServletRequestWrapper implements HttpServletRequest { 
    private HttpServletRequest originalRequest; 

    public MyHttpServletRequestWrapper(HttpServletRequest originalRequest) { 
     this.originalRequest = originalRequest; 

    public String getAuthType() {return originalRequest.getAuthType();} 
    public String getQueryString() {return originalRequest.getQueryString();} 
    // etc. 

    public Map getParameterMap() { 
     Map params = originalRequest.getParameterMap(); 
     params.remove("parameter-to-remove"); 
     params.put("parameter-to-add", "<a value>"); 
     //etc. 
    } 
} 

您的Servlet過濾器:

class MyFilter implements Filter { 
    public void init(FilterConfig config) { 
     // perhaps you might want to initialize something here 
    } 

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { 
     HttpServletRequest originalRequest = (HttpServletRequest) request; 
     HttpServletRequest newRequest = new MyHttpServletRequest(originalRequest); 
     chain.doFilter(newRequest, response); 
    } 
} 

您也可以繼承javax.servlet.request.HttpServletRequestWrapper,這將節省你一堆的工作。

查看此post瞭解更多信息。

+2

即使您鏈接到的帖子包含更多信息,您應該指定這應該使用過濾器完成(如果這是您的意思)。 – Vetle 2010-10-15 08:14:39

+0

非常感謝。我將使用HttpRequest對象的過濾器和包裝類。 – 2010-10-15 08:44:46

2

如果你一個簡單的一行後,這正則表達式技術爲我工作:

myURL = myURL.replaceAll("[&?]clear=([^&]$|[^&]*)", ""); 

如果你需要它在Javascript中,它非常類似於的確 - 這是很好的!

var myUrl = (""+window.location).replace(/&?clear=([^&]$|[^&]*)/i, ""); 

清楚是要除去的參數的名稱。

相關問題