在Netty4 WebSocket服務器中,如何確保瀏覽器正確接收到401響應?

在Netty4 WebSocket服務器中,如何確保瀏覽器正確接收到401響應?

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
喜歡就支持一下吧
點贊6 分享