websocket返回403并非权限问题,而是握手请求在nginx、spring security或后端校验层被提前拦截:需配置nginx透传upgrade/connection头、security显式放行/ws/*及/ws/info路径、spring boot改用setallowedoriginpatterns("")并避免通配符与凭据冲突。

WebSocket 返回 403,基本不是权限不足,而是握手请求在某一层被提前拦截或拒绝升级——它根本没走到鉴权逻辑里。直接修配置比查日志更快。
Spring Boot WebSocket 端点被 Security 拦截
Spring Security 默认会拦截所有路径,包括 /ws 和 /ws/info(后者是 SockJS 必需的探测端点)。哪怕你配了 setAllowedOriginPatterns("*"),SecurityFilterChain 也会在握手前就返回 403。
- 必须在
WebSecurity配置中显式忽略 WebSocket 路径:ignoring().requestMatchers("/ws/**", "/ws/info") - 若用的是 Spring Boot 3.x + Spring Security 6,
ignoring()已弃用,改用authorizeHttpRequests中的permitAll(),但注意:只对GET请求生效,Upgrade请求仍可能被拦,所以更稳妥的是用requestMatchers(HttpMethod.GET, "/ws/**", "/ws/info").permitAll() - 别只配
/ws,漏掉/ws/info会导致 SockJS 客户端连不上,报 403 或超时
Nginx 反向代理丢 Upgrade 头导致 403
本地直连正常、Nginx 后报 Expected HTTP 101 response but was '403 Forbidden',基本就是 Nginx 没透传协议升级信号。后端收不到 Upgrade: websocket 和 Connection: upgrade,就当普通 HTTP 请求处理,然后按默认策略拒掉。
WebSocket 8.18.2 是该协议规范的一个重要迭代版本,主要优化了连接稳定性与数据传输效率。它通过全双工通信机制,允许客户端与服务器在单一长连接上实时交换数据,大幅降低传统 HTTP 轮询的开销。该版本增强了心跳保活、自动重连及二进制帧传输能力,适用于即时通讯、在线游戏及金融行情推送等低延迟场景,为开发者提供更可靠的实时网络交互基础。
- 必须在
location块里写全三行:proxy_http_version 1.1、proxy_set_header Upgrade $http_upgrade、proxy_set_header Connection "upgrade" -
$http_upgrade是 Nginx 内置变量,不能写成字面量"websocket";Connection的值必须用双引号包裹"upgrade",否则 Nginx 启动失败 - 别加
proxy_set_header Origin ""——这会清空 Origin,让后端跨域校验直接失败;要绕过校验,应在后端处理,而不是在 Nginx 伪造头
allowedOrigins="*" 在 Spring Boot 2.6+ 报错或失效
调用 setAllowedOrigins("*") 出现启动异常,或前端带凭据(withCredentials: true)时仍 403,是因为 Spring Boot 2.5+ 已废弃该方法,且浏览器强制要求:含凭据的请求不允许用通配符。
- 必须改用
setAllowedOriginPatterns("*")(注意是OriginPatterns,不是Origins) - 如果前端 URL 是
http://localhost:3000,而服务端收到的Origin是http://127.0.0.1:3000,"*"不匹配,得显式列出:setAllowedOriginPatterns("http://localhost:3000", "http://127.0.0.1:3000") - 更灵活的做法是写自定义
HandshakeInterceptor,在beforeHandshake里动态检查并设置响应头,比如只允许含localhost或指定域名的 Origin
EdgeTTS 类项目连接微软服务返回 403
这类错误不是你配错了 Origin 或 Nginx,而是微软后端更新了 Token 校验逻辑或 IP 访问策略。错误信息通常是 WSServerHandshakeError: 403, message='Invalid response status',说明握手请求发出去了,但服务端拒绝了认证。
- 优先升级到最新版
edge-tts(如 6.1.14+),官方已修复 Token 构造和时间戳校验逻辑 - 若无法升级,临时可用代理绕过 IP 限制,但注意:代理本身也要支持 WebSocket 协议升级,否则照样 403
- 不要尝试手动拼接
Sec-WebSocket-Key或伪造TrustedClientToken——微软服务端有强校验,无效 token 会直接 403,且可能触发风控
真正卡住人的地方,往往不是某一个配置写错,而是多层叠加:Nginx 没传头 → Spring Security 拦了路径 → 后端又因 Origin 不匹配拒绝 → 最终统一表现为 403。逐层确认比全局改 CORS 更有效。










