Я надеюсь, что кто-то может указать, где я ошибаюсь. Я пытаюсь создать простой фильтр, который работает примерно так же, как URLRewriteFilter Пола Таки, но урезанный для выполнения только то, что мне нужно сделать.
Я не могу заставить его прекратить зацикливаться на исходном URI. Я просмотрел код URLRewriteFilter, и, похоже, он делает то же самое, что и я. Вот мой код фильтра:
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>
Некоторые примечания по коду: URI типа /home следует пересылать сервлету-диспетчеру следующим образом: /Dispatcher?q=/home сервлет-диспетчер затем определяет, какой код выполнять, основываясь на том, что находится в строке запроса.
Фильтр корректно игнорирует URI в ArrayList "uriIgnore" (включая /Dispatcher), но переадресация продолжает зацикливаться на /home. Для полноты картины вот содержимое списка uriIgnore ArrayList, который ищется в методе uriIsDispatchable выше:
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");
}
Кроме того, я использую последнюю версию Tomcat 6, проксированную за Apache.
Любая помощь приветствуется. Спасибо.