You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vaadin登录页集成spring-session-jdbc后持续自动重载问题排查求助

问题原因及解决办法

核心原因

引入Spring Session JDBC后出现无限重载,是两个配置冲突共同导致的:

  1. Vaadin的内部服务路径、静态资源路径没有被纳入Spring Security的忽略规则,会话持久化后这些内部请求会被拦截触发登录跳转
  2. Spring Session JDBC默认的会话序列化机制和Vaadin存储在会话中的UI实例不兼容,导致会话每次请求都被判定为无效,触发页面重载

具体修复步骤

步骤1:完善WebSecurity的忽略路径

修改WebSecurityConfig.java里的configure(WebSecurity web)方法,把Vaadin内部路径全部加入忽略列表:

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers(
        "/img/**",
        "/VAADIN/**",
        "/vaadinServlet/**",
        "/frontend/**",
        "/webjars/**"
    );
    super.configure(web);
}

这些路径是Vaadin加载静态资源、处理前端交互请求的专用路径,不需要走认证逻辑,之前未配置的话,会话持久化后每次请求这些路径都会被安全拦截,触发登录跳转形成循环。

步骤2:配置Spring Session的序列化策略

Vaadin的UI相关实例默认没有实现序列化接口,直接存在JDBC会话里会序列化失败,导致会话被判定为无效。可以在application.properties里增加以下配置:

spring.session.jdbc.servlet.session-persistent = false
spring.session.store-type = jdbc
spring.servlet.session.persistent = false

如果还是有异常,可以额外在PostgresConfig里配置Spring Session的序列化适配规则:

@Bean
public SpringSessionBackedSessionRegistry<?> sessionRegistry(IndexedSessionRepository sessionRepository) {
    return new SpringSessionBackedSessionRegistry<>(sessionRepository);
}

@Bean
public HttpSessionIdResolver httpSessionIdResolver() {
    return CookieHttpSessionIdResolver.defaultHttpSessionIdResolver();
}

步骤3:修复Connection lost问题

切换成原生Security适配器后出现连接丢失,是因为Vaadin的CSRF保护和Spring Security的CSRF保护冲突了,Vaadin自己处理CSRF,所以需要在HttpSecurity配置里关闭Spring Security的CSRF校验:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable();
    super.configure(http);
    setLoginView(http, LoginScreen.class);
}

完成以上三步后重启应用即可解决问题。

内容的提问来源于stack exchange,提问作者mad_lobster

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 05:57:00