如何使用 Gorilla Websockets 和 alexedwards/scs/v2 實作 http.Hijacker
php小編蘋果今天為大家介紹一個使用Gorilla Websockets和alexedwards/scs/v2函式庫來實作http.Hijacker的方法。這種方法可以幫助開發者在自己的應用程式中實現即時通訊的功能,無論是聊天室還是即時更新等場景,都可以透過這種方式實現。接下來,我們將詳細講解如何使用這兩個函式庫來實作http.Hijacker,讓你的應用程式更強大、更有彈性。
問題內容
最近將 Go Web 應用程式中出色的 alexedwards/scs/v2 從 2.5.0 升級到 2.7.0,以允許 Go 1.20 支援 http.NewResponseController()。隨後允許擴充處理程序特定的伺服器寫入逾時以進行大檔案上傳。這很好。 此必要升級的一個不幸後果是 websocket 功能的遺失,目前使用 Gorilla websockets v1.5.1(最新)。我在嘗試連接升級時遇到常見錯誤... websocket:回應未實作 http.Hijacker 我已經為此研究了幾個線索,其中一些是關於 SO 的,但我還無法解決任何特定於本案的問題。 我已經嘗試了一些嘗試與我的其他中間件代碼一起並在我的websocket 端點處理程序中實現http.Hijacker (註釋掉,附加“誤導”示例以供說明)...我只是認為我對此理解得不夠好。 ..
type WebsocketConnection struct { *websocket.Conn } type WebsocketPayload struct { Action string `json:"action"` Message string `json:"message"` AdminName string `json:"admin_name"` MessageType string `json:"message_type"` AdminID int `json:"admin_id"` Connection WebsocketConnection `json:"-"` } type WebsocketJSONResponse struct { Action string `json:"action"` Message string `json:"message"` AdminName string `json:"admin_name"` AdminID int `json:"admin_id"` CurrentLogins []string `json:"current_logins"` } var upgradeConnection = websocket.Upgrader{ ReadBufferSize: 1024, WriteBufferSize: 1024, CheckOrigin: func(r *http.Request) bool { return true }, } var webClients = make(map[WebsocketConnection]string) var websocketChannel = make(chan WebsocketPayload) func (app *application) WebsocketEndPoint(w http.ResponseWriter, r *http.Request) { // rc := http.NewResponseController(w) // netConn, _, err := rc.Hijack() // if err != nil { // app.errorLog.Println(err) // return // } // defer netConn.Close() app.debugLog.Printf("w's type is %T\n", w) ws, err := upgradeConnection.Upgrade(w, r, nil) if err != nil { app.errorLog.Println(err) <= ERROR HERE return } app.infoLog.Printf("Web client connected from %s", r.RemoteAddr) var response WebsocketJSONResponse response.Message = "Connected to server..." err = ws.WriteJSON(response) if err != nil { app.errorLog.Println(err) return } conn := WebsocketConnection{Conn: ws} webClients[conn] = "" go app.ListenForWebsocket(&conn) }
本例中的「w」是*scs.sessionResponseWriter。 如何在回應中實現 http.Hijacker 而不破壞連接並進行升級?請問正確的做法是什麼?
解決方法
alexedwards/scs/v2 軟體包版本 2.5.0 支援劫持者介面。 2.7.0 版本不支援 Hijacker 接口,但支援 支援回應控制器。 gorilla websocket 套件不使用回應控制器。
選項 1
#使用 alexedwards/scs/v2 軟體套件的 2.5.0。
選項 2
#透過在應用程式程式碼中解開回應編寫器來解決 gorilla 套件的缺陷:
func (app *application) WebsocketEndPoint(w http.ResponseWriter, r *http.Request) { wupgrade := w if u, ok := w.(interface{ Unwrap() http.ResponseWriter }); ok { wupgrade = u.Unwrap() } app.debugLog.Printf("w's type is %T\n", w) ws, err := upgradeConnection.Upgrade(wupgrade, r, nil) if err != nil { app.errorLog.Println(err) return } app.infoLog.Printf("Web client connected from %s", r.RemoteAddr) var response WebsocketJSONResponse response.Message = "Connected to server..." err = ws.WriteJSON(response) if err != nil { app.errorLog.Println(err) return } conn := WebsocketConnection{Conn: ws} webClients[conn] = "" go app.ListenForWebsocket(&conn) }
以上是如何使用 Gorilla Websockets 和 alexedwards/scs/v2 實作 http.Hijacker的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

OpenSSL,作為廣泛應用於安全通信的開源庫,提供了加密算法、密鑰和證書管理等功能。然而,其歷史版本中存在一些已知安全漏洞,其中一些危害極大。本文將重點介紹Debian系統中OpenSSL的常見漏洞及應對措施。 DebianOpenSSL已知漏洞:OpenSSL曾出現過多個嚴重漏洞,例如:心臟出血漏洞(CVE-2014-0160):該漏洞影響OpenSSL1.0.1至1.0.1f以及1.0.2至1.0.2beta版本。攻擊者可利用此漏洞未經授權讀取服務器上的敏感信息,包括加密密鑰等。

後端學習路徑:從前端轉型到後端的探索之旅作為一名從前端開發轉型的後端初學者,你已經有了nodejs的基礎,...

在BeegoORM框架下,如何指定模型關聯的數據庫?許多Beego項目需要同時操作多個數據庫。當使用Beego...

Go語言中用於浮點數運算的庫介紹在Go語言(也稱為Golang)中,進行浮點數的加減乘除運算時,如何確保精度是�...

Go爬蟲Colly中的Queue線程問題探討在使用Go語言的Colly爬蟲庫時,開發者常常會遇到關於線程和請求隊列的問題。 �...

Go語言中使用RedisStream實現消息隊列時類型轉換問題在使用Go語言與Redis...

Go語言中字符串打印的區別:使用Println與string()函數的效果差異在Go...

GoLand中自定義結構體標籤不顯示怎麼辦?在使用GoLand進行Go語言開發時,很多開發者會遇到自定義結構體標籤在�...
