Filter & RequestDispatcher 更改 URL 对现有过滤器的影响
Filter & RequestDispatcher to change URL effect on existing filters
我做了一个过滤器,负责向请求添加.do
,并且是第一个声明的过滤器:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
if(! (request instanceof HttpServletRequest)){
chain.doFilter(request, response );
}
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
String requestUrl = httpServletRequest.getServletPath();
if(!isBetaPathRequest(httpServletRequest) || StringUtils.contains(requestUrl,".")){
chain.doFilter(request, response );
return;
}
String newUrl = requestUrl;
int lastIndexOf = requestUrl.lastIndexOf("?");
if(lastIndexOf == -1){
if(requestUrl.charAt(requestUrl.length()-1) != '/'){
newUrl = newUrl.concat(".do");
}
}
else{
newUrl = requestUrl.substring(0, lastIndexOf-1) .concat(".do") .concat(requestUrl.substring(lastIndexOf));
}
final RequestDispatcher rq = getRequestDispatcher(request, newUrl);
rq.forward(request, response);
}
项目 web.xml
文件中还声明了其他各种过滤器,我通过调试器通知它们没有 运行。
一个重要过滤器的当前映射例如:
内容响应缓存过滤器
*。做
但是最初传入的请求在通过 BetaRewriteUrlFilter
之前不会在 URl 中包含 .do
。
调用 RequestDispatcher.forward 时,是否应用了过滤器,或者我们是否需要手动校准过滤器或改为使用 302 重定向???
我最后做的是将这个新过滤器放在 web.xml 定义的最后。
这个重写过滤器需要放在链的最后,因为使用 request dispatcher
forward
方法不会破坏功能或抑制其他过滤器的 运行。
我做了一个过滤器,负责向请求添加.do
,并且是第一个声明的过滤器:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
if(! (request instanceof HttpServletRequest)){
chain.doFilter(request, response );
}
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
String requestUrl = httpServletRequest.getServletPath();
if(!isBetaPathRequest(httpServletRequest) || StringUtils.contains(requestUrl,".")){
chain.doFilter(request, response );
return;
}
String newUrl = requestUrl;
int lastIndexOf = requestUrl.lastIndexOf("?");
if(lastIndexOf == -1){
if(requestUrl.charAt(requestUrl.length()-1) != '/'){
newUrl = newUrl.concat(".do");
}
}
else{
newUrl = requestUrl.substring(0, lastIndexOf-1) .concat(".do") .concat(requestUrl.substring(lastIndexOf));
}
final RequestDispatcher rq = getRequestDispatcher(request, newUrl);
rq.forward(request, response);
}
项目 web.xml
文件中还声明了其他各种过滤器,我通过调试器通知它们没有 运行。
一个重要过滤器的当前映射例如:
内容响应缓存过滤器 *。做
但是最初传入的请求在通过 BetaRewriteUrlFilter
之前不会在 URl 中包含 .do
。
调用 RequestDispatcher.forward 时,是否应用了过滤器,或者我们是否需要手动校准过滤器或改为使用 302 重定向???
我最后做的是将这个新过滤器放在 web.xml 定义的最后。
这个重写过滤器需要放在链的最后,因为使用 request dispatcher
forward
方法不会破坏功能或抑制其他过滤器的 运行。