首页手机go语言web开发教程 go语言web后端开发实例

go语言web开发教程 go语言web后端开发实例

圆圆2025-11-06 23:00:56次浏览条评论

Go语言WebSocket服务:解决403 Origin校验问题与最佳实践

本文研究探讨go语言中构建websocket服务时常见的403禁止错误,特别是由于默认的起源头部校验机制引起的。我们http://www.websocket.se rver`来取消或自定义源校验,从而保证websocket连接的成功建立,同时提供相关的安全考量和最佳实践。Go语言中的WebSocket服务基础

Go语言通过golang.org/x/net/websocket包(早期版本为code.google.com/p/go.net/websocket)提供了构建WebSocket服务的能力。该包简化了WebSock和echo 服务器通常会监听特定的 HTTP 路径,并把 HTTP 请求升级为全双工的 WebSocket 连接。

以下是常见的 Go 语言WebSocket // 推荐使用此路径)// webHandler 处理 WebSocket 连接,接收消息并打印 func webHandler(ws *websocket.Conn) { defer ws.Close() //确保连接关闭 var msg string for { // 尝试从WebSocket连接读取消息 if _, err := fmt.Fscan(ws, amp;msg); err != nil { // 通常是EOF错误表示断开客户端连接 if err.Error() == quot;EOFquot; { log.Println(quot;客户端断开连接。

quot;) } else { log.Printf(quot;WebSocket读取错误: vquot;, err) } break // 读取失败或断开客户端,退出循环 } fmt.Printf(quot;收到消息: s\nquot;, msg) // 示例:将消息回传给客户端,实现echo功能 if _, err := fmt.Fprint(ws, quot;Echo: quot; msg); err != nil { log.Printf(quot;WebSocket 写入错误: vquot;, err) break // 写入失败,断开连接 } }}func main() { fmt.Println(quot;启动WebSocket服务器,监听:8080...quot;) // 注册WebSocket处理器 http.Handle(quot;/echoquot;, websocket.Handler(webHandler)) //启动HTTP服务器 err := http.ListenAndServe(quot;:8080quot;, nil) // 尝试连接到服务器的WebSocket端点 const ws = new WebSocket(quot;ws://localhost:8080/echoquot;);ws.onopen = function() { console.log(quot;WebSocket连接已建立quot;); ws.send(quot;Hello from client!quot;); // 连接成功后发送消息};ws.onmessage = function(e) { console.log(quot;收到服务器消息: quot; e.data);};ws.onclose = function() { console.log(quot;WebSocket连接已关闭quot;);};ws.onerror = function(err) { console.error(quot;WebSocket错误: quot;, err);};登录后复制

当使用上述客户端尝试连接WebSocket连接到'ws://localhost:8080/echo'失败:意外响应码:403。

立即语言学习“go免费学习笔记(深入)”;理解403 Forbidden错误:Origin校验机制

这个403 Forbidden错误通常不是由于服务器配置不当,而是Go语言golang.org/x/net/websocket包中的一个默认安全机制启动。websocket.Handler在处理WebSocket握手请求时,会默认检查HTTP请求头中的Origin字段。

根据websocket.Handler的文档说明:Handler是一个简单的Web Socket浏览器客户端接口。它默认检查Origin头部是否是有效的URL。你可能需要验证websocket.Conn.Config().Origin在你的函数中。如果你使用Server而不是Handler,你可以调用websocket.Origin并在你的手上因此,如果你想接受不发送Origin头部的非浏览器客户端,你可以使用服务器,它在其握手中不检查Origin。

简而言之,websocket.Handler默认会尝试验证Origin头部。如果Origi头部返回、无效,或者不符合默认状态的校验规则,就会拒绝连接并返回403码。这对于跨域请求格式(CSRF)攻击是一种机制防御,但在某些解决场景下,例如服务器间特定通信或客户端不发送标准Origin头部时,这会成为一个问题。解决方案:使用websocket.Server进行Origin校验控制

为了这个问题,我们需要更精细地控制WebSock et的握手过程,特别是Origin校验。websocket.Server结构体提供了这种灵活性。通过它,我们可以自定义握手逻辑,或者像本例一样,简单地取消默认的Origin校验。文小言

百度推出了新的搜索智能助手,有问题,问小言。

57个细节

以下是修改后的Go服务器代码,它使用websocket.Serv er来处理WebSocket连接,从而绕过默认的Origin校验:package mainimport ( quot;fmtquot; quot;logquot; quot;net/httpquot; quot;golang.org/x/net/websocketquot;)// webHandler 处理WebSocket连接,接收消息并打印func webHandler(ws *websocket.Conn) { defer ws.Close() var msg string for { if _, err := fmt.Fscan(ws, amp;msg); err != nil { if err.Error() == quot;EOFquot; { log.Println(quot;客户端断开连接。

quot;) } else { log.Printf(quot;WebSocket 读取错误: vquot;, err) } break } fmt.Printf(quot;收到消息: s\nquot;, msg) //示例:回传消息给客户端 if _, err := fmt.Fprint(ws, quot;Echo: quot; msg); err != nil { log.Printf(quot;WebSocket 读取错误: vquot;, err) break } }}func main() { fmt.Println(quot;启动WebSocket服务器,监听:8080...quot;) // 使用http.HandleFunc注册一个处理函数 // http.HandleFunc(quot;/echoquot;, func(w http.ResponseWriter, req *http.Request) { //创建一个websocket.Server实例 // 将我们的webHandler作为其Handler //默认情况下,websocket.Server的Handshake函数不执行Origin校验:= websocket.Server{Handler: websocket.Handler(webHandler)} // 启动HTTP服务器 err := http.ListenAndServe(quot;:8080quot;, nil) if err != nil { log.Fatalf(quot;ListenAndServe失败: vquot;, err) }}登录后复制

通过这种方式,websocket.Server的默认握手逻辑将不会强制执行严格的源校验,从而允许客户端成功连接重要。注意事项和最佳实践

例如:s := websocket.Server{ Handler: websocket.Handler(webHandler), Handshake: func(config *websocket.Config, req *http.Request) (err error) { // 来源 := map[string]bool{ quot;http://localhost:8080quot;: true, // 允许本地开发环境 quot;https://your-frontend.comquot;: true, //允许生产环境前端 } if allowedOrigins[config.Origin.String()] { return nil // 允许连接 } return fmt.Errorf(quot;不允许的Origin: squot;, config.Origin.String()) },}› /p>

包路径更新:原始的code.google.com/p/go.net /websocket包已经废弃。在现代Go项目中,应使用golang.org/ x/net/websocket。请确保您的go.mod文件中正确插入了该模块。

错误处理:在webHandler中,对fmt.Fscan和fmt 。

p>WebSocket 连接生命周期:在 webHandler 的开头使用 defer ws.Close() 是一个习惯好,确保在处理函数结束时,无论何种原因,WebSocket 连接都会被正确关闭,释放资源。

总结

在Go中构建WebSocket服务时,遇到403 403 起源: javascript java前 go golang 处理器 go语言器 浏览 websocket ai 跨域 JavaScript golang csrf echo EOF 结构体接口 go语言 http websocket 大家都在看:利用AJAX和Go构建WebSocket应用:从JavaScript调用Go托管服务从JavaScript调用Go托管服务:构建Web应用的AJAX实践 MongoDB JavaScript字段值评估:深入理解与实践MongoDB服务器端JavaScript执行:动态字段值与eval命令实践MongoDB中JavaScript代码的服务器端执行与字段值动态赋值

Go语言WebSoc
配置日志文件 如何配置日志服务器
相关内容
发表评论

游客 回复需填写必要信息