web.xml - Java Servlet Filter - das ausgeführt wird nicht vor der JSP-Seite der Verarbeitung (auf Tomcat)

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

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.

War es hilfreich?

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);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top