web.xml - Фильтры Java-сервлетов - Не запускаются перед обработкой страницы JSP (на Tomcat)
-
19-09-2019 - |
Вопрос
Я довольно новичок в фильтрах сервлетов и в основном присоединился к проекту, использующему их, и добавил дополнительный фильтр в 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);
}