
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后浏览器无反应的原因是什么?如何解决?的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/166753.html
微信扫一扫
支付宝扫一扫