当前位置: 代码网 > it编程>编程语言>Java > WebSocket服务器返回401后浏览器无反应的原因是什么?如何解决?

WebSocket服务器返回401后浏览器无反应的原因是什么?如何解决?

2025年03月28日 Java 我要评论
netty websocket服务器返回401,浏览器无响应的解决策略在使用netty构建websocket服务器并进行token验证时,如果token无效,服务器返回401状态码并关闭连接,浏览器却

websocket服务器返回401后浏览器无反应的原因是什么?如何解决?

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后浏览器无反应的原因是什么?如何解决?的详细内容,更多请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com