为了账号安全,请及时绑定邮箱和手机立即绑定

如何正确拒绝 websocket 升级请求?

如何正确拒绝 websocket 升级请求?

Go
明月笑刀无情 2022-11-08 15:41:30
有时我想拒绝 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 不提供有关连接被拒绝的原因的信息,因为该信息可能违反同源策略

执行以下操作以将错误原因发送回客户端应用程序或用户:

  1. 升级连接。

  2. 发送带有错误原因的关闭消息。

  3. 关闭连接。

这是一个例子:

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)

    }

}


查看完整回答
反对 回复 2022-11-08
  • 1 回答
  • 0 关注
  • 141 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信