升级VaadinWebSecurity后自定义WebSocket无法访问的问题求助
解决Vaadin 23.2升级后自定义WebSocket无法访问的问题
问题根源
Vaadin 23.2的VaadinWebSecurity会自动构建SecurityFilterChain,默认拦截几乎所有请求路径(包括你的自定义WebSocket端点/websocket),导致请求被Vaadin自身的WebSocket处理逻辑接管,返回你看到的sessionExpired消息。此外,你原配置中先自定义权限规则再调用super.configure(http)的顺序,会让Vaadin的规则覆盖掉自定义配置。
修复方案
方案1:排除WebSocket路径让Spring接管
修改SecurityConfiguration,通过WebSecurity忽略自定义WebSocket路径,同时调整配置顺序确保Vaadin规则先加载:
@EnableWebSecurity @Configuration public class SecurityConfiguration extends VaadinWebSecurity { public static final String LOGOUT_URL = "/"; public static final String WEBSOCKET_URL = "/websocket"; // 修正原拼写错误 @Override protected void configure(HttpSecurity http) throws Exception { // 先加载Vaadin的默认安全配置 super.configure(http); // 添加自定义WebSocket路径的权限规则 http.authorizeRequests() .antMatchers(WEBSOCKET_URL) .permitAll(); setLoginView(http, LoginView.class, LOGOUT_URL); } @Override protected void configure(WebSecurity web) throws Exception { super.configure(web); // 让Vaadin安全链不处理该WebSocket路径,交给Spring WebSocket处理器 web.ignoring().antMatchers(WEBSOCKET_URL); } }
方案2:限定Vaadin的请求匹配范围
如果需要Spring Security对WebSocket路径做权限校验,可自定义Vaadin的RequestMatcher,排除WebSocket路径:
@EnableWebSecurity @Configuration public class SecurityConfiguration extends VaadinWebSecurity { public static final String LOGOUT_URL = "/"; public static final String WEBSOCKET_URL = "/websocket"; @Override protected void configure(HttpSecurity http) throws Exception { // 自定义Vaadin请求匹配器,排除WebSocket路径 VaadinWebSecurityConfigurer vaadinConfig = http.apply(vaadinWebSecurity()); vaadinConfig.requestMatcher(new VaadinRequestMatcher() { @Override public boolean matches(HttpServletRequest request) { if (WEBSOCKET_URL.equals(request.getRequestURI())) { return false; } return super.matches(request); } }); // 配置WebSocket路径的权限 http.authorizeRequests() .antMatchers(WEBSOCKET_URL) .permitAll(); vaadinConfig.loginView(LoginView.class, LOGOUT_URL); } }
额外注意事项
- 修正原代码中变量名拼写错误:
WEBSOCKET_URl→WEBSOCKET_URL,避免路径匹配失败 - 在WebSocket处理器的
afterConnectionEstablished方法中添加日志,验证连接是否成功建立 - 确保Spring Boot版本与Vaadin 23.2.1兼容(Spring Boot 2.7.x是推荐版本)
内容的提问来源于stack exchange,提问作者Jonas TM
相关产品推荐
相关产品推荐

