websocket跨域不依赖cors机制,服务端必须在握手阶段主动校验origin请求头并拒绝非法来源,前端无法干预该过程。

JavaScript 本身不能用 CORS 策略过滤 WebSocket 的非法来源——因为 WebSocket 不走 CORS 机制。
WebSocket 跨域不依赖 CORS 响应头
浏览器在发起 WebSocket 连接时,会发送一个 HTTP 升级请求(Upgrade: websocket),并自动带上 Origin 请求头(如 Origin: https://myapp.com)。但和普通 fetch/XHR 不同:
- 服务端 不会 通过返回
Access-Control-Allow-Origin等 CORS 头来放行 WebSocket 连接; - 设置这些响应头对 WebSocket 握手 完全无效,握手成功后通信也不再使用 HTTP 语义;
- 真正的校验发生在服务端收到 Upgrade 请求的那一刻,由服务端代码主动读取并判断
Origin是否合法。
过滤非法来源的实际做法是服务端验证 Origin
前端 JavaScript 无法控制或干预这个过程,但服务端必须做以下事情:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 在 WebSocket 握手阶段(即处理
GET /ws请求时),解析请求头中的Origin字段; - 比对是否在预设白名单中(例如
['https://myapp.com', 'http://localhost:5173']); - 若不匹配,直接拒绝连接(返回
403 Forbidden或不返回101 Switching Protocols); - 避免使用通配符
*放行所有 Origin,防止跨站 WebSocket 劫持(CSWSH)。
常见服务端验证示例
以 Node.js 的 ws 库为例,使用 verifyClient 钩子:
const wss = new WebSocket.Server({
port: 8080,
verifyClient: (info) => {
const origin = info.origin;
const allowedOrigins = ['https://myapp.com', 'http://localhost:5173'];
return allowedOrigins.includes(origin);
}
});
Nginx 反向代理时还需确保透传关键头:
proxy_set_header Upgrade $http_upgrade;<br> proxy_set_header Connection "upgrade";
否则 Origin 可能丢失,导致服务端无法校验。
前端能做的只有正确发起连接
前端只需按标准方式创建 WebSocket 实例,无需额外配置 CORS 相关选项:
const ws = new WebSocket('wss://api.example.com/ws');
如果服务端拒绝了 Origin,浏览器控制台通常显示:WebSocket connection to 'wss://...' failed: Error during WebSocket handshake: Unexpected response code: 403
这说明过滤已生效——拦截动作完全由服务端完成,前端无权绕过或干预。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










