首页 > 后端开发 > Golang > 正文

使用 Golang 构建支持跨域 WebSocket 服务

霞舞
发布: 2025-09-08 12:30:01
原创
435人浏览过

使用 golang 构建支持跨域 websocket 服务

WebSocket 与跨域资源共享 (CORS) 的区别

WebSocket 协议与 HTTP 协议有所不同,因此传统的跨域资源共享 (CORS) 机制并不适用于 WebSocket 连接。CORS 是一种基于 HTTP 头的机制,用于控制不同源的客户端脚本对服务器资源的访问。而 WebSocket 建立连接后,使用一种完全不同的协议进行数据传输。

WebSocket 连接的跨域控制依赖于客户端发送的 Origin 头部。当客户端发起 WebSocket 连接时,浏览器(或者其他客户端)会在请求头中包含 Origin 头部,表明发起请求的页面的源(协议、域名和端口)。服务器可以根据 Origin 头部的值来判断是否允许该连接。

需要注意的是,非浏览器客户端可能不会自动添加 Origin 头部,或者可以随意设置该头部的值。因此,服务器端需要谨慎处理 Origin 头部,避免安全风险。

Golang WebSocket 服务端实现

以下是一个简单的 Golang WebSocket 服务端示例,展示了如何处理 Origin 头部:

立即学习go语言免费学习笔记(深入)”;

微信二级防封域名
微信二级防封域名

防封域名方法千千种,我们只做最简单且有用的这一种。微信域名防封是指通过技术手段来实现预付措施,一切说自己完全可以防封的那都是不可能的,一切说什么免死域名不会死的那也是吹牛逼的。我们正在做的是让我们的推广域名寿命更长一点,成本更低一点,效果更好一点。本源码采用 ASP+ACCESS 搭建,由于要用到二级域名,所以需要使用独享云虚机或者云服务器,不支持虚拟主机使用,不支持本地测试。目前这是免费测试版,

微信二级防封域名 0
查看详情 微信二级防封域名
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))
}
登录后复制

代码解释:

  1. websocket.Upgrader: 用于将 HTTP 连接升级为 WebSocket 连接。
  2. CheckOrigin: 一个函数,用于检查 Origin 头部。在本例中,它允许来自 http://example.com 和 http://localhost:8080 的连接,拒绝其他来源的连接。
  3. echo: WebSocket 连接处理函数。它将接收到的消息原样返回给客户端。
  4. main: 启动 HTTP 服务器,监听 :8080 端口,并将 /echo 路径映射到 echo 函数。

注意事项:

  • CheckOrigin 函数是控制跨域 WebSocket 连接的关键。根据实际需求,可以修改该函数以允许或拒绝特定的 Origin。
  • 在生产环境中,应该对 Origin 头部进行更严格的验证,防止恶意客户端伪造 Origin 头部。
  • 可以使用 net/http 包的 Header.Get("Origin") 方法获取 Origin 头部的值。

PhoneGap 应用中的 WebSocket 连接

如果你的 PhoneGap 应用运行在 iOS 模拟器中,并且无法建立 WebSocket 连接,可以尝试以下步骤:

  1. 检查 Origin 头部: 使用网络抓包工具(如 Wireshark)检查 PhoneGap 应用发起的 WebSocket 请求是否包含 Origin 头部,以及 Origin 头部的值是否正确。
  2. 配置服务器: 确保服务器的 CheckOrigin 函数允许来自 PhoneGap 应用的 Origin。
  3. PhoneGap 配置: 检查 PhoneGap 应用的配置文件(config.xml),确保没有阻止跨域请求的设置。 某些插件或配置可能会影响 WebSocket 连接。
  4. 调试: 使用 Safari 的开发者工具连接到 iOS 模拟器中的 WebView,并检查 JavaScript 控制台是否有任何错误信息。

总结

通过正确配置服务器端的 CheckOrigin 函数,可以有效地控制跨域 WebSocket 连接。在开发过程中,需要仔细检查客户端发送的 Origin 头部,并根据实际需求进行验证,以确保安全性和可靠性。 尤其是在 PhoneGap 等混合应用开发中,要注意 WebView 的特殊性,进行充分的测试和调试。

以上就是使用 Golang 构建支持跨域 WebSocket 服务的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号