web.xml - Java Servlet Filtri - Non essendo eseguito prima elaborazione della pagina JSP (su Tomcat)
-
19-09-2019 - |
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.
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);
}