Netty4 websocket服務器中正確處理401響應,確保瀏覽器接收
在使用Netty 4構建WebSocket服務器時,如果身份驗證失敗,需要正確地向瀏覽器發送401 (Unauthorized) 響應。 直接關閉連接可能導致瀏覽器無法識別錯誤原因。以下改進后的代碼確保瀏覽器能夠接收并處理401響應:
問題:在WebSocket握手階段,如果身份驗證失敗,服務器直接關閉連接,瀏覽器無法接收到預期的401響應。
解決方案:在關閉連接前,必須確保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(future -> { if (future.isSuccess()) { // 響應成功發送后關閉連接 ctx.close(); } else { // 響應發送失敗,也關閉連接 ctx.close(); // 可選:記錄錯誤日志 logger.error("Failed to send 401 response: {}", future.cause()); } }); ReferenceCountUtil.release(request); }
關鍵改進:
- addListener 用于確保響應發送完成: writeAndFlush 方法是異步的。addListener 會在響應完全寫入通道后執行回調函數,確保在關閉連接前,401響應已發送。
- 錯誤處理: 添加了錯誤處理,如果響應發送失敗,也會關閉連接并可選地記錄錯誤日志,方便調試。 這對于生產環境至關重要。
- 清晰的代碼結構: 代碼結構更加清晰,易于理解和維護。
通過此改進,瀏覽器將接收401響應,并能夠根據該狀態碼進行相應的處理,例如顯示錯誤信息或重定向到登錄頁面。 記住添加必要的日志記錄,以便在出現問題時能夠快速診斷。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END