gpt4 book ai didi

java - Spring Boot、Spring Security、 session 范围 Bean 的 session 超时问题,@PreDestroy

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:08:21 28 4
gpt4 key购买 nike

首先,我需要说明我正在使用 session 作用域 bean。所以在 session 关闭之前调用 preDestroy() 方法

@Component
@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS, value = "session")
public class MySessionBean {

@PreDestroy
public void preDestroy() {

//Do Smth with using Security principal

}
}

当我使用 Spring Security utils 注销 时,一切正常,preDestroy() 方法被调用。

我使用
的时候遇到的主要问题

server.session-timeout = 60application.properties 中的 = 1

  1. preDestroy() 在 session 打开后大约 2.5 分钟 被调用。
  2. 更有趣的是 SecurityContextHolder.getContext().getAuthentication().getPrincipal();null
    但是我已经成功退出。

我也试过

@Bean
public EmbeddedServletContainerCustomizer servletContainerCustomizer() {
return (ConfigurableEmbeddedServletContainer configurableEmbeddedServletContainer) ->
configurableEmbeddedServletContainer.setSessionTimeout(1, TimeUnit.MINUTES);
}

我有同样的结果。
使用提供的Tomcat时也存在问题

更新:

The weird thing is that if I manually after 1 minute check the session existence the method preDestroy() is called immediately. But Security Principal is already null


提前致谢!

最佳答案

当 session 超时时 SecurityContextHolder.getContext().getAuthentication().getPrincipal()总是返回null . SecurityContext仅在收到请求时才填充,其中一个过滤器会执行此操作。当 session 超时时,过滤器当然不会被调用,因此 SecurityContext没有填满。

而是创建一个实现 ApplicationListener<HttpSessionDestroyedEvent> 的 bean . HttpSessionDestroyedEvent 有一个方法 getSecurityContexts 返回 SecurityContext与原来在 HttpSession 中一样.

public class YourListener implements ApplicationListener<HttpSessionDestroyedEvent> {

public void onApplicationEvent(HttpSessionDestroyedEvent evt) {
for (SecurityContext ctx : evt.getSecurityContexts() ) {
Authentication auth = ctx.getAuthentication();
Object principal = auth.getPrincipal();
// Do your thing with the principal.
}
}
}

关于java - Spring Boot、Spring Security、 session 范围 Bean 的 session 超时问题,@PreDestroy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32569946/

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