kma*_*oor 10 spring spring-security servlet-filters
我有六次自定义注销过滤器.我尝试访问应用程序时两次,当我输入用户名/密码并单击"登录"时再两次,然后当我点击"注销"时再次两次.
我究竟做错了什么?
组态:
<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" />
Run Code Online (Sandbox Code Playgroud)
过滤器:
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);
}
Run Code Online (Sandbox Code Playgroud)
}
Spring版本:4.1.1 Spring安全性:3.2.5
mik*_*pr4 30
如果您在使用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>
Run Code Online (Sandbox Code Playgroud)
它可能会被请求的其他 URL 调用。例如,如果您有任何加载到页面上的 css、javascript、图像,它将为每个图像调用。尝试添加一个显示当前请求信息的日志语句,以确定是否是这种情况。例如,
logger.error("URL = " + req.getRequestURL());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13020 次 |
| 最近记录: |