2015-03-26 17 views
6

Tôi có một bộ lọc tùy chỉnh logout gọi là sáu lần. Hai lần trong thời gian sớm tôi cố gắng truy cập vào các ứng dụng, hai lần khi tôi nhập username/password và nhấp vào 'Đăng nhập' và sau đó hai lần một lần nữa khi tôi bấm vào 'logout'.mùa xuân bộ lọc bảo mật tùy chỉnh được gọi nhiều lần

Tôi đang làm gì sai?

Cấu hình:

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

Bộ lọc:

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

}

phiên bản

mùa xuân: 4.1.1 an ninh mùa xuân: 3.2.5

Trả lời

4

Nó có khả năng được gọi cho các URL khác đang được yêu cầu. Ví dụ, nếu bạn có bất kỳ css, javascript, hình ảnh nào được tải trên trang, nó sẽ được gọi cho mỗi cái. Hãy thử thêm câu lệnh ghi nhật ký hiển thị thông tin yêu cầu hiện tại để tìm hiểu xem đó có phải là trường hợp không. Ví dụ,

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

Nếu bạn đang sử dụng Spring Boot, bất kỳ GenericFilterBean (OncePerRequestFilter là một) trong bối cảnh sẽ được tự động thêm vào chuỗi lọc. Có nghĩa là cấu hình bạn có ở trên sẽ bao gồm cùng một bộ lọc hai lần.

Cách giải quyết đơn giản nhất của việc này là để xác định một FilterRegistrationBean trong bối cảnh, và có nó tàn tật:

<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

Cảm ơn, bạn đã cứu tôi! –

+0

Cảm ơn bạn! Thêm một câu trả lời tương tự ở đây (sau khi đọc câu trả lời này và các câu trả lời khác) - http://stackoverflow.com/a/37904857/1882064 trong trường hợp nó giúp làm rõ câu trả lời này cho bất kỳ ai. – arcseldon

Các vấn đề liên quan