登录
首页 >  Golang >  Go问答

拒绝websocket升级请求的正确方法

来源:stackoverflow

时间:2024-02-12 23:00:30 303浏览 收藏

大家好,我们又见面了啊~本文《拒绝websocket升级请求的正确方法》的内容中将会涉及到等等。如果你正在学习Golang相关知识,欢迎关注我,以后会给大家带来更多Golang相关文章,希望我们能一起进步!下面就开始本文的正式内容~

问题内容

有时我想拒绝http客户端将连接升级到websocket的请求。

代码

(使用 gogingorilla/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
}

说明:这里拒绝升级我只是返回一个http 400代码,然后终止连接,根本没有进行升级。

问题

使用有关代码拒绝 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)。
  • 除了返回像 400 这样的 http 代码之外,还有更好的方法来拒绝 websocket 升级请求吗?

正确答案


要拒绝 websocket 连接,请不要按照问题中所述升级连接。 浏览器 api 不提供有关连接被拒绝原因的信息,因为该信息可能违反 same-origin policy

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

  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)
    }
}

终于介绍完啦!小伙伴们,这篇关于《拒绝websocket升级请求的正确方法》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>