
WebSocket 与跨域资源共享 (CORS) 的区别
WebSocket 协议与 HTTP 协议有所不同,因此传统的跨域资源共享 (CORS) 机制并不适用于 WebSocket 连接。CORS 是一种基于 HTTP 头的机制,用于控制不同源的客户端脚本对服务器资源的访问。而 WebSocket 建立连接后,使用一种完全不同的协议进行数据传输。
WebSocket 连接的跨域控制依赖于客户端发送的 Origin 头部。当客户端发起 WebSocket 连接时,浏览器(或者其他客户端)会在请求头中包含 Origin 头部,表明发起请求的页面的源(协议、域名和端口)。服务器可以根据 Origin 头部的值来判断是否允许该连接。
需要注意的是,非浏览器客户端可能不会自动添加 Origin 头部,或者可以随意设置该头部的值。因此,服务器端需要谨慎处理 Origin 头部,避免安全风险。
Golang WebSocket 服务端实现
以下是一个简单的 Golang WebSocket 服务端示例,展示了如何处理 Origin 头部:
立即学习“go语言免费学习笔记(深入)”;
Destoon B2B网站管理系统是一套完善的B2B(电子商务)行业门户解决方案。系统基于PHP+MySQL开发,采用B/S架构,模板与程序分离,源码开放。模型化的开发思路,可扩展或删除任何功能;创新的缓存技术与数据库设计,可负载千万级别数据容量及访问。 系统特性1、跨平台。支持Linux/Unix/Windows服务器,支持Apache/IIS/Zeus等2、跨浏览器。基于最新Web标准构建,在
package main
import (
"fmt"
"log"
"net/http"
"github.com/gorilla/websocket"
)
var upgrader = websocket.Upgrader{
CheckOrigin: func(r *http.Request) bool {
origin := r.Header.Get("Origin")
// 允许特定的 Origin
if origin == "http://example.com" || origin == "http://localhost:8080" {
return true
}
// 拒绝其他 Origin
return false
},
}
func echo(w http.ResponseWriter, r *http.Request) {
c, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Print("upgrade:", err)
return
}
defer c.Close()
for {
mt, message, err := c.ReadMessage()
if err != nil {
log.Println("read:", err)
break
}
log.Printf("recv: %s", message)
err = c.WriteMessage(mt, message)
if err != nil {
log.Println("write:", err)
break
}
}
}
func main() {
http.HandleFunc("/echo", echo)
log.Fatal(http.ListenAndServe(":8080", nil))
}代码解释:
- websocket.Upgrader: 用于将 HTTP 连接升级为 WebSocket 连接。
- CheckOrigin: 一个函数,用于检查 Origin 头部。在本例中,它允许来自 http://example.com 和 http://localhost:8080 的连接,拒绝其他来源的连接。
- echo: WebSocket 连接处理函数。它将接收到的消息原样返回给客户端。
- main: 启动 HTTP 服务器,监听 :8080 端口,并将 /echo 路径映射到 echo 函数。
注意事项:
- CheckOrigin 函数是控制跨域 WebSocket 连接的关键。根据实际需求,可以修改该函数以允许或拒绝特定的 Origin。
- 在生产环境中,应该对 Origin 头部进行更严格的验证,防止恶意客户端伪造 Origin 头部。
- 可以使用 net/http 包的 Header.Get("Origin") 方法获取 Origin 头部的值。
PhoneGap 应用中的 WebSocket 连接
如果你的 PhoneGap 应用运行在 iOS 模拟器中,并且无法建立 WebSocket 连接,可以尝试以下步骤:
- 检查 Origin 头部: 使用网络抓包工具(如 Wireshark)检查 PhoneGap 应用发起的 WebSocket 请求是否包含 Origin 头部,以及 Origin 头部的值是否正确。
- 配置服务器: 确保服务器的 CheckOrigin 函数允许来自 PhoneGap 应用的 Origin。
- PhoneGap 配置: 检查 PhoneGap 应用的配置文件(config.xml),确保没有阻止跨域请求的设置。 某些插件或配置可能会影响 WebSocket 连接。
- 调试: 使用 Safari 的开发者工具连接到 iOS 模拟器中的 WebView,并检查 JavaScript 控制台是否有任何错误信息。
总结
通过正确配置服务器端的 CheckOrigin 函数,可以有效地控制跨域 WebSocket 连接。在开发过程中,需要仔细检查客户端发送的 Origin 头部,并根据实际需求进行验证,以确保安全性和可靠性。 尤其是在 PhoneGap 等混合应用开发中,要注意 WebView 的特殊性,进行充分的测试和调试。









