无尽码路

清凉夏日,您升官了吗?
Android连GO的WebSocket报403
at 2023-01-18 11:28:12, by 鹏城奋青

问题:Android连就出403问题,而浏览器JS连没有问题,可见服务本身是没有问题的。

原因:Go的WebSocket服务框架会强制校验请求头中的Origin项,因此需要在客户端请求头中添加此项。

解决如例:

launch (Dispatchers.IO) {
            val request = Request
                .Builder()
                // 关键:添加Origin项,以免被GO的WebSocket服务框架拒绝
                .header("Origin", "ws://${App.server}/") 
                .url("ws://${App.server}/socket/test")
                .build()
            val client = HttpManager.getClient()
            webSocket = client.newWebSocket(request, object: WebSocketListener() {
                override fun onMessage(webSocket: WebSocket, text: String) {
                    logger.info("onMessage: $text")
                }
                override fun onClosed(webSocket: WebSocket, code: Int, reason: String) {
                    logger.info("onClosed: code=$code, reason=$reason")
                }
                override fun onOpen(webSocket: WebSocket, response: Response) {
                    logger.info("onOpen:")
                }
                override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) {
                    logger.info("onFailure: ${t.message}")
                }
            })
        }

补充:OKHttpClient构建时,可以使用CookieJar带上Cookie以保持会话,这样可以在服务端接入WebSocket时使用会话验证身份。