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

StackOverflow https://stackoverflow.com/questions/1720670

Вопрос

Я довольно новичок в фильтрах сервлетов и в основном присоединился к проекту, использующему их, и добавил дополнительный фильтр в web.xml файл (развернутый на Кот 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>

Заранее благодарю.

Это было полезно?

Решение 2

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

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

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

Другие советы

Как обстоят дела с 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.
}

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

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

Одна очевидная ошибка заключается в сопоставлении фильтров trinidad.У него должно быть не имя сервлета, а шаблон URL.

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

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);
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top