SessionCreatedEvent在Spring-Boot 2.7 -> 3升级后不再触发

ruyhziif  于 11个月前  发布在  Spring
关注(0)|答案(1)|浏览(86)

在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,但这些似乎也没有被解雇。

txu3uszq

txu3uszq1#

对此,spring Boot 3.2.0支持。
将**@EnableRedisHttpSession更改为->@EnableRedisIndexedHttpSession,此更改将在RedisSessionRepository上配置RedisIndexedSessionRepository**。
通过使用这个RedisIndexedSessionRepository,你现在可以开始监听SessionCreatedEventSessionDeletedEventSessionDestroyedEventSessionExpiredEvent事件。
如需详细说明,请访问此处。如需收听会话事件,请访问此处。

相关问题