2015-03-26 17 views
6

Ho un filtro di disconnessione personalizzato chiamato sei volte. Due volte non appena provo ad accedere all'applicazione, due volte quando inserisco username/password e clicco su 'Login' e poi di nuovo due volte quando clicco su 'logout'.Filtro personalizzato di sicurezza Spring chiamato più volte

Cosa sto sbagliando?

Configurazione:

<http auto-config="true" use-expressions="true"> 
    <intercept-url pattern="/admin/**" access="hasRole('ROLE_ADMIN_FUNCTIONS')" />  
    <intercept-url pattern="/**" access="hasRole('ROLE_USER')" /> 

    <form-login login-page="/login" 
     authentication-success-handler-ref="customAuthenticationSuccessHandlerBean" 
     authentication-failure-handler-ref="customAuthenticationFailureHandlerBean" /> 
    <logout invalidate-session="true" success-handler-ref="logoutHandlerBean" /> 
    <session-management session-fixation-protection="migrateSession"> 
     <concurrency-control max-sessions="1" 
      expired-url="/login_sessionexpired" /> 
    </session-management> 

    <custom-filter before="LOGOUT_FILTER" ref="customLogoutFilter" /> 
</http> 

<beans:bean id="customLogoutFilter" class="com.hurontg.libms.security.CustomLogoutFilter" /> 

Il filtro:

public class CustomLogoutFilter extends OncePerRequestFilter { 
/** 
* 
*/ 
private XLogger logger = XLoggerFactory 
     .getXLogger(CustomLogoutFilter.class.getName()); 

@Override 
protected void doFilterInternal(HttpServletRequest req, 
     HttpServletResponse res, FilterChain chain) 
     throws ServletException, IOException { 

    logger.error("========================================================================================"); 
    logger.error("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ Custom Logout Filter $$$$$$$$$$$$$$$$$$$$$$$$$$$$$"); 
    logger.error("========================================================================================"); 

    chain.doFilter(req, res); 
} 

}

versione

Primavera: 4.1.1 sicurezza Primavera: 3.2.5

risposta

4

è probabile essere chiamato per altri URL che vengono richiesti. Ad esempio, se hai css, javascript, le immagini che vengono caricate nella pagina verranno chiamate per ognuna di esse. Prova ad aggiungere un'istruzione di registrazione che mostra le informazioni sulla richiesta corrente per scoprire se questo è il caso. Ad esempio,

logger.error("URL = " + req.getRequestURL()); 
16

Se si utilizza Primavera di avvio, qualsiasi GenericFilterBean (OncePerRequestFilter è uno) nel contesto verrà aggiunto automaticamente alla catena dei filtri. Significa che la configurazione che hai sopra includerà lo stesso filtro due volte.

La soluzione più semplice per questo è di definire una FilterRegistrationBean nel contesto, e lo hanno disabilitato:

<beans:bean id="customLogoutFilterRegistration" class="org.springframework.boot.context.embedded.FilterRegistrationBean"> 
    <beans:property name="filter" ref="customLogoutFilter"/> 
    <beans:property name="enabled" value="false"/> 
</beans:bean> 
+2

Grazie, mi hai salvato! –

+0

Grazie! Aggiunta una risposta simile qui (dopo aver letto questa e altre risposte) - http://stackoverflow.com/a/37904857/1882064 nel caso in cui aiuti a chiarire questa risposta per chiunque. – arcseldon

Problemi correlati