如何使用过滤器或 servlet 更改 requestURL。
例如,如果请求是“http://servername1:8080”,我想将其更改为“http://servername2:7001”
如何使用过滤器或 servlet 更改 requestURL。
例如,如果请求是“http://servername1:8080”,我想将其更改为“http://servername2:7001”
将以下servlet 过滤器添加到您的应用程序:
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()
,但提供包装的请求,而不是原始请求。
与网络上使用 .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()
}