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时使用会话验证身份。