在Spring-Boot 2.7.x中,我收到了SessionCreatedEvent和SessionDestroyedEvent事件。升级到Spring Boot 3.0.x后,这些事件不再传递到我的应用程序。但我仍然收到SessionFixationProtectionEvent事件。我使用Redis进行会话管理。我尝试转到Spring Boot 3.1.x,但没有帮助。
我在@Configuration
类上有@EnableRedisHttpSession(flushMode = FlushMode.IMMEDIATE, saveMode = SaveMode.ALWAYS, maxInactiveIntervalInSeconds = 600)
。
我将SecurityFilterChain配置为:
return http
.securityContext((securityContext) -> securityContext
.requireExplicitSave(false)
)
.authorizeHttpRequests()
.requestMatchers(EndpointRequest.toAnyEndpoint()).anonymous()
.requestMatchers("/error", "/favicon.ico").permitAll()
.requestMatchers(HttpMethod.GET, "/login", "/assets/**").permitAll()
.anyRequest().authenticated()
.and()
.headers()
.frameOptions().sameOrigin()
.xssProtection().and()
.and()
.logout()
.logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
.deleteCookies("JSESSIONID")
.permitAll()
.and()
.sessionManagement()
.invalidSessionStrategy(new RestfulApiInvalidSessionStrategy(new AntPathRequestMatcher("/api/**")))
.invalidSessionUrl("/login")
.sessionCreationPolicy(IF_REQUIRED)
.sessionFixation().changeSessionId()
.maximumSessions(2).maxSessionsPreventsLogin(false)
.expiredSessionStrategy(new RestfulApiInvalidSessionStrategy(new AntPathRequestMatcher("/api/**")))
.expiredUrl("/login?expired")
.and()
.and()
.formLogin()
.loginPage("/login").permitAll()
.successHandler(this.authenticationSuccessHandler)
.failureHandler(this.authenticationFailureHandler)
.and()
.httpBasic()
.and()
.csrf().disable()
.build()
字符串
我的事件侦听器是这样的:
@EventListener
public void onSessionCreated(SessionCreatedEvent event) {
log.info("session created");
}
@EventListener
public void onSessionDestroyed(SessionDestroyedEvent event) {
log.info("session destroyed");
}
@Order(Ordered.HIGHEST_PRECEDENCE)
@EventListener(SessionFixationProtectionEvent.class)
public void onSessionFixationProtectionEvent(SessionFixationProtectionEvent event) {
log.info("session migrated");
}
型
我已经注册了HttpSessionEventPublisher:
@Bean
public ServletListenerRegistrationBean<HttpSessionEventPublisher> httpSessionEventPublisher() {
return new ServletListenerRegistrationBean<>(new HttpSessionEventPublisher());
}
型
我不知道我还需要做什么。它在2.7中工作,但在3.0中不工作。我试过注册@WebListener
并侦听HttpSessionEvents,但这些似乎也没有被解雇。
1条答案
按热度按时间txu3uszq1#
对此,spring Boot 3.2.0支持。
将**
@EnableRedisHttpSession
更改为->@EnableRedisIndexedHttpSession
,此更改将在RedisSessionRepository上配置RedisIndexedSessionRepository**。通过使用这个
RedisIndexedSessionRepository
,你现在可以开始监听SessionCreatedEvent
、SessionDeletedEvent
、SessionDestroyedEvent
和SessionExpiredEvent
事件。如需详细说明,请访问此处。如需收听会话事件,请访问此处。