Vaadin登录页集成spring-session-jdbc后持续自动重载问题排查求助
问题原因及解决办法
核心原因
引入Spring Session JDBC后出现无限重载,是两个配置冲突共同导致的:
- Vaadin的内部服务路径、静态资源路径没有被纳入Spring Security的忽略规则,会话持久化后这些内部请求会被拦截触发登录跳转
- 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
相关产品推荐
相关产品推荐

