【问题标题】:how to change the requestURL using filter or servlet如何使用过滤器或 servlet 更改 requestURL
【发布时间】:2012-09-21 02:28:09
【问题描述】:

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

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

【问题讨论】:

标签: url servlets request port servlet-filters


【解决方案1】:

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

但是,为了使其对下游过滤处理“透明”,必须实现 2 个额外的方法,并且它们必须呈现相同的 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()
}

【讨论】:

    【解决方案2】:

    将以下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(),但要提供封装的请求,而不是原始请求。

    【讨论】:

    • 最后我遇到了这个错误:构造函数 HttpServletRequestWrapper(ServletRequest) 未定义
    • Rabia,您可能需要将 HttpServletRequest 传递给包装器构造函数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 2016-10-23
    • 1970-01-01
    • 2016-03-13
    • 2012-02-19
    相关资源
    最近更新 更多