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

升级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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 00:45:40