web.xml - Java Servlet Filter - das ausgeführt wird nicht vor der JSP-Seite der Verarbeitung (auf Tomcat)
-
19-09-2019 - |
Frage
Ich bin ziemlich neu in Servlets Filter und haben im Grunde ein Projekt mit ihnen und fügte einen zusätzlichen Filter in die web.xml
Datei (Einsatz auf Tomcat 5.5 ) verbunden.
Ich bin 95% sicher, dass es irgendwann richtig funktionierte, aber jetzt beim Debuggen, wenn ich an der Spitze der JSP-Seite setzen Haltepunkte ich Ansicht versuche (login.jsp
), ist es der Vorlagenseite (page.jsp
) und innerhalb der beiden die doFilter()
Verfahren konfigurierten Filter; es zieht sich durch die Gesamtheit der login.jsp
Seite (von oben nach unten), dann page.jsp
und die Starts der Filter verarbeitet werden.
Ich brauche es die Filter zuerst laufen, da einer von ihnen die Sprache bestimmt, die Seite sollte in (Überprüfung Cookies, db Einstellungen und Browser-Einstellungen) angezeigt werden, die dann auf die login.jsp
gelten sollten.
Hat jemand irgendwelche Vorschläge, was könnte schief gehen werden?
Es gibt eine Menge von Code, den ich Posting sein könnte, aber überzeugt bin nicht so von Nutzen wäre, da es alles funktioniert nur in der falschen Reihenfolge.
Snippets aus der 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>
Vielen Dank im Voraus.
Lösung 2
Vielen Dank für Ihre Antworten - Ich habe jetzt verstanden, das Problem vollständig ... es geschieht nur für die login.jsp Seite, keine der anderen Seiten. Und in meinem Fall die login .jsp
Seite ist ein Sonderfall, weil es in der Regel als Ergebnis einer Umleitung betrachtet wird.
Im 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>
Und ich nehme an, weil dieser, werden die Filter nicht in der üblichen Reihenfolge getroffen! Hinzugefügt einen Anruf von der Login-Seite zu tun, was die Filter funktionieren und alles ist gut.
Vielen Dank noch einmal.
Andere Tipps
Wie wird der Filter
Code organisiert? Sind Sie vielleicht erste FilterChain#doFilter()
und erst danach tun die benötigte Logik nennen?
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.
}
Der Grund, dass die Filter nicht für login.jsp genannt wurden, ist, dass Tomcat Interpretation der Spezifikation ist, dass die Authentifizierung Teil des Behälters ist, die nicht Teil der Webapp, und tritt so außerhalb der Rolle von Filtern. Daher Filter auf die Login-Seite nicht angewandt werden (login.jsp in diesem Fall) oder j_security_check.
ref: https://issues.apache.org/bugzilla/show_bug. ? cgi id = 21795 -. der Titel nur Verweise j_security_check, aber die Diskussion deckt die gesamte formularbasierte Authentifizierungsmechanismus
Ein offensichtlicher Fehler ist in der trinidad-Filterzuordnung. Es soll nicht einen Servlet-Namen, aber ein URL-Muster.
Ich hatte das gleiche Problem, wenn ich schrieb:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
if(...) {
response.sendRedirect(url);
}
chain.doFilter(request, response);
}
statt
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
if(...) {
response.sendRedirect(url);
return;
}
chain.doFilter(request, response);
}