在Servlet過濾器下面的代碼有爲我們工作。這個想法是通過使用自定義響應包裝來覆蓋任何URL重寫邏輯。
public void doFilter(
ServletRequest req,
ServletResponse resp,
FilterChain filterChain)
throws IOException, ServletException
{
if (req instanceof HttpServletRequest &&
resp instanceof HttpServletResponse)
{
doFilter(
(HttpServletRequest) req,
(HttpServletResponse) resp,
filterChain);
}
else
{
filterChain.doFilter(req, resp);
}
}
private void doFilter(
HttpServletRequest request,
HttpServletResponse response,
FilterChain filterChain)
throws IOException, ServletException
{
RequestHandler requestHandler = getRequestHandler(request);
HttpServletResponse wrappedResponse = getWrappedResponse(response);
filterChain.doFilter(request, wrappedResponse);
}
private HttpServletResponse getWrappedResponse(
HttpServletResponse response)
{
return
new HttpServletResponseWrapper(response)
{
public String encodeRedirectUrl(String url) { return url; }
public String encodeRedirectURL(String url) { return url; }
public String encodeUrl(String url) { return url; }
public String encodeURL(String url) { return url; }
};
}