2009-11-12 2 views
1

Я довольно новичок в фильтрах сервлетов и в основном присоединился к проекту, используя их, и добавил дополнительный фильтр в файл web.xml (развернутый на Tomcat 5.5).web.xml - Фильтры сервлетов Java - Не запускаются до обработки страницы JSP (на Tomcat)

Я 95% уверен, что в какой-то момент она работает правильно, но теперь при отладке, если я ставлю точки останова в верхней части страницы JSP Я пытаюсь смотреть (login.jsp), это шаблон страницы (page.jsp) и в обоих метода doFilter() сконфигурированного фильтра; он проходит по всей странице login.jsp (сверху вниз), затем page.jsp и начинает обработку фильтров.

Для этого сначала нужно запустить фильтры, так как один из них определяет язык, на котором должна отображаться страница (проверка файлов cookie, настроек db и настроек браузера), которые затем должны применяться к login.jsp.

Есть ли у кого-нибудь какие-либо предложения относительно того, что может произойти неправильно?

Существует много кода, который я могу опубликовать, но я не уверен, что это будет полезно, поскольку все работает только в неправильном порядке.

Отрывки из web.xml:

<web-app> 
... 
<filter> 
     <filter-name>SetSecurityContextFilter</filter-name> 
     <filter-class> 
      com.section2.SecurityContextServletFilter 
     </filter-class> 
    </filter> 

<filter> 
    <filter-name>SetLocaleFilter</filter-name> 
    <filter-class> 
     com.section2.locale.LocaleServletFilter 
    </filter-class> 
</filter> 

<filter> 
    <filter-name>trinidad</filter-name> 
    <filter-class>org.apache.myfaces.trinidad.webapp.TrinidadFilter</filter-class> 
</filter> 

<filter> 
    <filter-name>ActiveUserFilter</filter-name> 
    <filter-class>com.section2.ActiveUserFilter</filter-class> 
</filter> 

    <filter-mapping> 
     <filter-name>trinidad</filter-name> 
     <servlet-name>Faces Servlet</servlet-name> 
    </filter-mapping> 

    <filter-mapping> 
     <filter-name>SetSecurityContextFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

    <filter-mapping> 
     <filter-name>SetLocaleFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

    <filter-mapping> 
     <filter-name>ActiveUserFilter</filter-name> 
     <url-pattern>/pages/section2/user/*</url-pattern> 
    </filter-mapping> 

... 
</web-app> 

Спасибо заранее.

+0

Вы взглянули на http://java.sun.com/products/servlet/Filters.html и http://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/Filter.html? Не зная, что вы делаете, трудно себе представить, что пошло не так. Вы пробовали другой контейнер сервлетов, как причал? –

ответ

1

Спасибо за ваши ответы - я теперь понял вопрос полностью ... это происходит только на странице login.jsp, ни один из других страниц. И в моем случае, страница login .jsp - это особый случай, потому что это обычно рассматривается как результат перенаправления.

В web.xml:

<login-config> 
     <auth-method>FORM</auth-method> 
     <form-login-config> 
      <form-login-page>/login.jsp</form-login-page> 
      <form-error-page>/login.jsp?error=true</form-error-page> 
     </form-login-config> 
    </login-config> 

И я полагаю, из-за этого, фильтры не попали в обычном порядке! Добавлен вызов со страницы входа, чтобы сделать то, что делает фильтр, и все хорошо.

Еще раз спасибо.

0

Очевидная ошибка в отображении фильтра тринидада. Он не должен иметь имя сервлета, а шаблон url.

+0

Совершенно верно. Это означает только то, что конкретный фильтр связан с сервлетом, о котором идет речь, и поэтому он вызывается только по одному и тому же шаблону url. – BalusC

7

Как формируется код Filter? Вы можете позвонить сначала FilterChain#doFilter() и только после этого сделать необходимую логику?

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { 
    // Any code here will be executed BEFORE passing request through JSP/Servlet. 
    chain.doFilter(request, response); 
    // Any code here will be executed AFTER passing request through JSP/Servlet. 
} 
0

Причина, по которой фильтр не был вызван для login.jsp, заключается в том, что интерпретация Tomcat спецификации заключается в том, что аутентификация является частью контейнера, а не частью webapp, и поэтому происходит вне роли фильтров. Следовательно, фильтры не применяются к странице входа (login.jsp в этом случае) или j_security_check.

ref: https://issues.apache.org/bugzilla/show_bug.cgi?id=21795 - только ссылки ссылаются на j_security_check, но обсуждение охватывает весь механизм аутентификации на основе форм.

0

Я была такая же проблема, когда я писал:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { 
    if(...) { 
     response.sendRedirect(url); 
    } 
    chain.doFilter(request, response); 
} 

вместо

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { 
    if(...) { 
     response.sendRedirect(url); 
     return; 
    } 
    chain.doFilter(request, response); 
}