Java筛选器URL重写循环问题
我希望有人能指出我的错误所在。我正在尝试创建一个简单的过滤器,它的工作原理类似于,但只需要剥离它来做我需要它做的事情 我无法让它停止在原始URI上循环。我已经窥探了URLRewriteFilter代码,它似乎在做与我基本相同的事情。这是我的过滤代码:Java筛选器URL重写循环问题,java,url-rewriting,servlet-filters,Java,Url Rewriting,Servlet Filters,我希望有人能指出我的错误所在。我正在尝试创建一个简单的过滤器,它的工作原理类似于,但只需要剥离它来做我需要它做的事情 我无法让它停止在原始URI上循环。我已经窥探了URLRewriteFilter代码,它似乎在做与我基本相同的事情。这是我的过滤代码: public static final String dispatcherURI = "/Dispatcher?q="; public void doFilter(final ServletRequest request, final Servle
public static final String dispatcherURI = "/Dispatcher?q=";
public void doFilter(final ServletRequest request, final ServletResponse response,
final FilterChain chain)
throws IOException, ServletException {
final HttpServletRequest rq = (HttpServletRequest)request;
final HttpServletResponseWrapper rsw =
new HttpServletResponseWrapper((HttpServletResponse)response);
final String uri = rq.getRequestURI();
if (uriIsDispatchable(uri)) {
final String forwardPath = dispatcherURI+uri;
rq.getRequestDispatcher(forwardPath).forward(rq, rsw);
LOG.info("Forward From: "+uri+", To: "+forwardPath);
}
else {
try { chain.doFilter(request, response); }
catch (Exception e) {
LOG.error(e);
throw new RuntimeException(e);
}
}
}
// checks URI against an ArrayList of URIs that should be ignored.
private static boolean uriIsDispatchable (final String uri) {
boolean result = true;
for (String i : ApplicationValues.uriIgnore) {
if (uri.indexOf(i) == 0) {
result = false;
break;
}
}
return result;
}
下面是web.xml中的过滤器条目
<filter>
<filter-name>UrlRewriteFilter</filter-name>
<filter-class>myapp.filter.URLRewrite</filter-class>
</filter>
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
URL重写过滤器
myapp.filter.URLRewrite
URL重写过滤器
/*
关于代码的一些注释:
像/home这样的URI应该转发到像这样的调度器servlet:/dispatcher?q=/home
然后,DispatcherServlet根据查询字符串中的内容确定要执行的代码
过滤器正确地忽略了“uriIgnore”ArrayList(包括/Dispatcher)中的URI,但转发继续在/home上循环。为完整起见,以下是在上面的uriIsDispatchable方法中搜索的uriIgnore ArrayList的内容:
public static final List<String> uriIgnore = new ArrayList<String>(4);
static {
uriIgnore.add("/Dispatcher");
uriIgnore.add("/netbeans-tomcat-status-test");
uriIgnore.add("/resources");
uriIgnore.add("/robots.txt");
}
publicstaticfinallist=newarraylist(4);
静止的{
uriIgnore.add(“/Dispatcher”);
添加(“/netbeans tomcat状态测试”);
添加(“/resources”);
uriIgnore.add(“/robots.txt”);
}
另外,我正在运行Apache背后的最新Tomcat6代理
感谢您的帮助。谢谢。我认为当程序执行以下语句时:rq.getRequestDispatcher(forwardPath).forward(rq,rsw); 它将再次调用doFilter(
)方法,然后程序将成为一个无止境的循环。
我想您可以添加一个参数来判断url是否来自另一个doFilter(
),这样它就可以识别并转发url了。当我有时间进一步阅读URLRewrite筛选器代码时,我会想办法解决这个问题,但与此同时,如果我真的想要最高性能的url重写,我将让mod_重写并由Apache完成
我的解决方案(我相信还有更好的方法):
#.htaccess文件内容
#Apache与Java web应用程序具有相同的docroot。
#Java webapp正在端口8084上运行
重新启动发动机
重写基/
重写cond%{REQUEST_FILENAME}-f[NC,或]
重写cond%{REQUEST_FILENAME}-D
#图像、静态html文件和JS脚本所在的目录。
#阿帕奇将提供这些服务。
重写规则^resources-[L,NC]
#显然,我们希望Apache为robots.txt提供服务
重写规则^robots.txt$-[L,NC]
重写规则^(.*)$http://localhost:8084/Dispatcher?q=$1[L,P,QSA]
相同的无限循环问题,将URLRewiter配置为仅过滤请求,而不是转发,然后重试
在您的web.xml中如下所示:
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
URL重写过滤器
/*
要求
在这种情况下,转发后不会再次执行规则处理。转发将导致doFilter再次运行,但我认为问题在于转发的请求保留原始URI,而不是转发的URI,这会导致循环。根据我从URLRewiteFilter代码中收集到的信息,他使用了与我使用的相同的前向调用,但他没有循环。我已经在我的服务器上用同样的规则试用了Tuckey UrlRewriteFilter,它运行得很好。我确信我遗漏了一些简单而明显的东西。当我找到这个问题的Java解决方案时,我一定会把它贴在这里。
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>