netty websocket服务器返回401,浏览器无响应的解决策略
在使用netty构建websocket服务器并进行token验证时,如果token无效,服务器返回401状态码并关闭连接,浏览器却可能无任何反应。本文分析此问题并提供解决方案。
问题描述
使用netty开发websocket服务器,需要验证token。token验证失败时,服务器返回401并关闭连接,但浏览器没有响应,前端无法得知连接关闭原因。 服务器端代码示例:
private void httpresponse401(channelhandlercontext ctx, fullhttprequest request) { fullhttpresponse response = new defaultfullhttpresponse(request.protocolversion(), httpresponsestatus.unauthorized); response.headers().set(httpheadernames.content_length, 0); ctx.writeandflush(response).addlistener(channelfuturelistener.close); referencecountutil.release(request); }
前端javascript代码:
var socket = new websocket("ws://127.0.0.1:18080/ws?token=xxxx");
服务器虽然返回401并关闭连接,但浏览器却没有任何反应。
解决方案
浏览器无响应是因为401响应在websocket握手阶段被忽略了。 我们需要在握手阶段或连接建立后进行处理。
方案一:在握手阶段返回401响应
在websocket握手阶段(http请求阶段),token验证失败则直接返回http 401响应,避免建立websocket连接。 修改服务器端代码:
if (!validatetoken(request)) { fullhttpresponse response = new defaultfullhttpresponse(httpversion.http_1_1, httpresponsestatus.unauthorized); response.headers().set(httpheadernames.content_type, "text/plain; charset=utf-8"); response.headers().set(httpheadernames.content_length, response.content().readablebytes()); ctx.writeandflush(response).addlistener(channelfuturelistener.close); return; }
方案二:连接建立后发送自定义消息
如果需要在websocket连接建立后再处理401,可以在连接建立后立即发送自定义消息通知前端。 在netty的websocketserverprotocolhandler中添加自定义处理器:
channel.pipeline().addlast(new websocketserverprotocolhandler("/ws") { @override public void usereventtriggered(channelhandlercontext ctx, object evt) throws exception { if (evt == websocketserverprotocolhandler.serverhandshakestateevent.handshake_complete) { if (!validatetoken()) { ctx.writeandflush(new textwebsocketframe("401 unauthorized")).addlistener(channelfuturelistener.close); } } super.usereventtriggered(ctx, evt); } });
前端javascript代码需要监听onmessage事件:
socket.onmessage = function(event) { if (event.data === "401 unauthorized") { console.log("连接关闭,原因:401 unauthorized"); socket.close(); } };
通过以上方法,浏览器就能正确处理401状态码,前端也能收到相应的反馈信息,从而解决浏览器无响应的问题。 选择哪种方案取决于具体的应用场景和需求。
以上就是websocket服务器返回401后浏览器无反应的原因是什么?如何解决?的详细内容,更多请关注代码网其它相关文章!
发表评论