4

我一直在玩 Go 中的 gorilla-websocket,当我实现基本的 echo 示例时,我在部署服务器后记录了一个错误,

找不到源 Websocket 版本!= 13

我找到了一种绕过此问题的方法,方法是使检查原点的函数始终返回 true

var wsUpgrader = websocket.Upgrader{
    ReadBufferSize:  1024,
    WriteBufferSize: 1024,
    CheckOrigin: func(r *http.Request) bool {
        return true
    },
}

但是感觉不太对。因此,我正在寻找解决该问题的方法。

更新:在再次查看问题之后,我似乎实际上正在寻找将原始标头添加到客户端实现,即 javascript websocket 实现

@benjic 我通过 javascript html5 应用程序连接到 websocket,该应用程序未托管在同一台服务器上,但由我通过 chrome 在本地运行

那我该怎么做。

4

2 回答 2

5

通读Gorilla WebSocket 文档表明,当为类型的CheckOrigin字段提供 nil 值时,将Upgrader使用安全默认值。默认情况下检查传入请求的Origin字段与Host标头值,以确认它们在允许请求之前相等。该文档表明浏览器不强制执行跨源有效性,并且服务器应用程序有责任强制执行。您可以在 Gorilla 库的源代码中准确了解这是如何完成的。

文档和源代码指示了包中的一个Upgrade函数,该函数websocket充当上述示例代码的工厂。工厂函数采用自定义缓冲区大小并覆盖 CheckOrigin 以始终返回 true。Upgrader您可以在 中使用此工厂函数HttpHandler来升级您的连接,而不是创建自定义。

func webSocketHandler(w http.ResponseWriter, r *http.Request) {
    conn, err := websocket.Upgrade(w, r, nil, 1024, 1024)
    defer conn.Close()

    if err != nil {
        http.Error(w, err, http.StatusInternalServerError)
        return
    }

    conn.WriteMessage(websocket.TextMessage, []byte("Hello, world!"))
}
于 2015-10-25T02:59:50.020 回答
1

将您的 html 部署到服务器,例如 nginx 或仅使用节点启动。然后它将在浏览器中获取主机名和端口。

然后在创建时允许该地址Upgrader,例如:

var origins = []string{ "http://127.0.0.1:18081", "http://localhost:18081", "http://example.com"}
var _ = websocket.Upgrader{
    // Resolve cross-domain problems
    CheckOrigin: func(r *http.Request) bool {
        var origin = r.Header.Get("origin")
        for _, allowOrigin := range origins {
            if origin == allowOrigin {
                return true
            }
        }
        return false
    }}
于 2022-01-08T08:32:30.393 回答