web.xml - Java Servlet Filtri - Non essendo eseguito prima elaborazione della pagina JSP (su Tomcat)

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

Domanda

Sono abbastanza nuovo per Servlet Filters e hanno sostanzialmente aderito a un progetto che li utilizzano e ha aggiunto un filtro aggiuntivo al file web.xml (distribuito su Tomcat 5.5 ).

Sono sicuro al 95% che ad un certo punto stava funzionando correttamente, ma ora in fase di debug se metto i punti di interruzione nella parte superiore della pagina JSP che sto cercando di vedere (login.jsp), è modello di pagina (page.jsp) e all'interno di entrambi metodo doFilter() del filtro configurato; si attraversa l'intero della pagina login.jsp (dall'alto in basso), quindi page.jsp e inizia il trattamento dei filtri.

ho bisogno per eseguire i filtri prima, dal momento che uno di loro determina la lingua della pagina dovrebbe essere visualizzata in (cookie di controllo, le impostazioni di db e le impostazioni del browser), che dovrebbe quindi applicare al login.jsp.

Qualcuno ha qualche suggerimento su cosa potrebbe andare storto?

C'è un sacco di codice potrei essere distacco, ma non sono convinto che sarebbe di qualche utilità dal momento che è tutto il funzionamento solo in ordine errato.

Frammenti dal 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>

Grazie in anticipo.

È stato utile?

Soluzione 2

Grazie per le vostre risposte - ho ormai capito il problema completamente ... succede solo per la pagina login.jsp, nessuna delle altre pagine. E nel mio caso, la pagina login .jsp è un caso speciale perché è visto di solito come conseguenza di un reindirizzamento.

Nel 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>

E presumo a causa di questo, i filtri non sono colpiti nell'ordine solito! Aggiunta una chiamata dalla pagina di login di fare ciò che il filtro fa e tutto va bene.

Grazie di nuovo.

Altri suggerimenti

Come è organizzato il codice di Filter? Sei forse chiamando prima FilterChain#doFilter() e solo successivamente facendo la logica necessaria?

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.
}

La ragione per cui il filtro del non sono stati chiamati per login.jsp è che l'interpretazione di Tomcat delle specifiche è che l'autenticazione è parte del contenitore, non fanno parte della webapp, e così avviene al di fuori del ruolo dei filtri. Quindi filtri non vengono applicati alla pagina di login (login.jsp in questo caso) o j_security_check.

ref: https://issues.apache.org/bugzilla/show_bug. cgi id = 21795 -?. il titolo solo riferimenti j_security_check, ma la discussione copre l'intero meccanismo di autenticazione basata su form

Un errore evidente è nella mappatura del filtro Trinidad. Non dovrebbe avere un nome servlet, ma un url-pattern.

Ho avuto lo stesso problema quando ho scritto:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
   if(...) {
      response.sendRedirect(url);
   }
   chain.doFilter(request, response);
}

invece

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
   if(...) {
      response.sendRedirect(url);
      return;
   }
   chain.doFilter(request, response);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top