有時我想拒絕 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?
uj5u.com熱心網友回復:
要拒絕 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)
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/424141.html
標籤:javascript http 去 网络套接字 大猩猩
下一篇:錯誤去:模塊github.com/golang/protobuf已棄用:改用“google.golang.org/protobuf”模塊
