有时我想拒绝 http 客户端升级到 websocket 连接的请求。代码(使用go'sGin和gorilla/websocket框架:)允许升级:c, err := ctl.upgrader.Upgrade(ctx.Writer, ctx.Request, nil)err = c.WriteJSON(resp)拒绝升级(由于请求参数无效):if contentId == "" || !exists { // FIXME: provide response in a way that ws client can recognize & show tip? ctx.String(http.StatusBadRequest, "invalid or non-existing contentId") return}说明:这里拒绝升级我只是返回一个http400代码,然后终止连接,根本没有做升级。问题使用 about 代码拒绝 websocket 升级请求的问题是,websocket 客户端(例如js)无法在我的响应中读取数据(文本或 json) 。代码 - 客户端( js):ws.onerror = function (evt) { // TOOD: handle error, (e.g print error msg?), print("ERROR");}它确实打印了"ERROR"拒绝,但是在检查了有关该evt对象的 chrome 开发人员工具后,找不到获取服务器响应数据的方法,因此我无法以拒绝的原因向前端 UI 显示提示。问题如何正确拒绝 websocket 升级请求,并让客户端能够接收返回的原因/数据?(例如客户端是js,服务器是go// gin)gorilla/websocket。除了返回 http 代码之外,有没有更好的方法来拒绝 websocket 升级请求400?
1 回答
交互式爱情
TA贡献1712条经验 获得超3个赞
要拒绝 websocket 连接,请不要按照问题中的描述升级连接。浏览器 API 不提供有关连接被拒绝的原因的信息,因为该信息可能违反同源策略。
执行以下操作以将错误原因发送回客户端应用程序或用户:
升级连接。
发送带有错误原因的关闭消息。
关闭连接。
这是一个例子:
c, err := ctl.upgrader.Upgrade(ctx.Writer, ctx.Request, nil)
if err != nil {
// TODO: handle error
}
if contentId == "" || !exists {
c.WriteMessage(websocket.CloseMessage,
websocket.FormatCloseMessage(websocket.ClosePolicyViolation,
"bad content id or not exist"))
c.Close()
return
}
// Continue with non-error case here.
从 JS 中的关闭处理程序访问原因:
ws.onclose = function (evt) {
if (evt.code == 1008) { // 1008 is policy violation
console.log(evt.reason)
}
}
- 1 回答
- 0 关注
- 165 浏览
添加回答
举报
0/150
提交
取消