如何使用过滤器或servlet更改requestURL

时间:2012-09-29 13:09:13

标签: url servlets request port servlet-filters

如何使用过滤器或servlet更改requestURL。

例如,如果请求是“http:// servername1:8080” 我想将其更改为“http:// servername2:7001”

2 个答案:

答案 0 :(得分:13)

将以下servlet filter添加到您的应用中:

public class RequestUrlRewritingFilter implements Filter {

    //Empty init()/destroy() here

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        final HttpServletRequestWrapper wrapped = new HttpServletRequestWrapper(request) {
            @Override
            public StringBuffer getRequestURL() {
                final StringBuffer originalUrl = ((HttpServletRequest) getRequest()).getRequestURL();
                return new StringBuffer("http://servername2:7001");
            }
        };
        chain.doFilter(wrapped, response);
    }
}

您要拦截的所有请求都必须通过它。如您所见,它采用原始request方法,并通过返回不同的值来覆盖getRequestURL()方法。如果您想在旧的URL上建立新的URL,您仍然可以访问原始请求。

最后,您必须继续处理请求chain.doFilter(),但必须提供已包装的请求,而不是原始请求。

答案 1 :(得分:0)

与使用.forward()的网络上的许多其他人相比,上面是一个很好的解决方案,因为它打破了过滤器链。此解决方案允许后续过滤器在修改后处理请求。

但是为了使下游过滤器处理“透明”,必须实现另外两种方法,并且它们必须对URL进行相同的修改以呈现一致的请求对象。包装器必须实现:

@Override
public String getRequestURI() {
    final String originalUri = ((HttpServletRequest)getRequest()).getRequestURI();
    return "/"; // Must be consistent with getRequestURL()
}
@Override
public String getServletPath() {
    final String originalPath = ((HttpServletRequest)getRequest()).getServletPath();
    return "/"; // Must be consistent with getRequestURL()
}