2010-10-15 120 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, ""); 

清楚是要除去的参数的名称。

相关问题