2015-03-26 2 views
6

У меня есть пользовательский фильтр выхода, который называется шесть раз. Дважды, как только я пытаюсь получить доступ к приложению, дважды, когда я ввожу имя пользователя/пароль и нажимаю «Войти», а затем дважды, когда я нажимаю «Выход».Пружинный фильтр пользовательского фильтра, вызываемый несколько раз

Что я делаю неправильно?

Конфигурация:

<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" /> 

Фильтр:

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); 
} 

}

Весна версия: 4.1.1 Весна безопасности: 3.2.5

ответ

4

Это, вероятно, называют для других URL-адресов, которые запрашиваются. Например, если у вас есть какие-либо css, javascript, изображения, загружаемые на страницу, они будут вызываться для каждого из них. Попробуйте добавить оператор регистрации, который отображает текущую информацию о запросе, чтобы узнать, так ли это. Например,

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

Если вы используете Spring бутс, любой GenericFilterBean (OncePerRequestFilter это один) в контексте будет автоматически добавлены в цепочку фильтров. Значение, указанное выше, будет включать в себя тот же фильтр дважды.

Самый простой обходной путь для этого является определение в контексте с FilterRegistrationBean, и он отключен:

<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

Спасибо, вы спасли меня! –

+0

Спасибо! Добавлен аналогичный ответ здесь (после прочтения этого и других ответов) - http://stackoverflow.com/a/37904857/1882064, если это поможет прояснить этот ответ для всех. – arcseldon