web.xml - Фильтры сервлетов Java - Не запускаются перед обработкой страницы JSP (в Tomcat) - PullRequest
1 голос
/ 12 ноября 2009

Я довольно новичок в Servlet Filters и, по сути, присоединился к проекту, используя их, и добавил дополнительный фильтр в файл web.xml (развернут в Tomcat 5.5 ).

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

Мне нужно сначала запустить фильтры, так как один из них определяет язык, на котором должна отображаться страница (проверка файлов cookie, настройки БД и настройки браузера), который затем должен применяться к 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>

Заранее спасибо.

Ответы [ 5 ]

8 голосов
/ 12 ноября 2009

Как организован код 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.
}
1 голос
/ 17 декабря 2013

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

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

1 голос
/ 12 ноября 2009

Спасибо за ваши ответы - теперь я полностью понял проблему ... это происходит только для страницы 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 голосов
/ 11 августа 2017

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

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);
}
0 голосов
/ 12 ноября 2009

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

...