gpt4 book ai didi

多次调用 Spring 安全自定义过滤器

转载 作者:行者123 更新时间:2023-12-04 02:34:33 25 4
gpt4 key购买 nike

我有一个名为六次的自定义注销过滤器。我尝试访问应用程序后两次,当我输入用户名/密码并单击“登录”时两次,然后当我单击“注销”时再次两次。

我究竟做错了什么?

配置:

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

}

Spring 版本:4.1.1
Spring 安全:3.2.5

最佳答案

如果您使用的是 Spring Boot,任何 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>
编辑(11/3/2020):
对于在 SpringBoot 中工作并希望使用注释注册 bean 的任何人。在 Spring Boot 应用程序初始值设定项文件(带有 @SpringBootApplication 注释的一个)中添加以下代码:
@Bean
public FilterRegistrationBean filterRegistrationBean() {
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
registrationBean.setFilter(new YourCustomFilterClassName());
registrationBean.setEnabled(false);
return registrationBean;
}

关于多次调用 Spring 安全自定义过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29285607/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com