From f35eca9a145491eee387d10a8374ac087253ed19 Mon Sep 17 00:00:00 2001 From: zbzbzzz Date: Sun, 2 Jul 2023 15:26:00 +0800 Subject: [PATCH] =?UTF-8?q?feat:ws=E6=8F=A1=E6=89=8B=E5=90=8C=E6=97=B6?= =?UTF-8?q?=E8=AE=A4=E8=AF=81=20=E4=BB=A5Sec-Websocket-Protocol=E7=9A=84?= =?UTF-8?q?=E5=BD=A2=E5=BC=8F=E4=BC=A0=E9=80=92token?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../user/websocket/HttpHeadersHandler.java | 21 ++------------ .../user/websocket/NettyWebSocketServer.java | 3 +- .../websocket/WebSocketHandshakeHandler.java | 29 +++++++++++++++++++ 3 files changed, 32 insertions(+), 21 deletions(-) create mode 100644 mallchat-custom-server/src/main/java/com/abin/mallchat/custom/user/websocket/WebSocketHandshakeHandler.java diff --git a/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/user/websocket/HttpHeadersHandler.java b/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/user/websocket/HttpHeadersHandler.java index b5112e4..6b55b91 100644 --- a/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/user/websocket/HttpHeadersHandler.java +++ b/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/user/websocket/HttpHeadersHandler.java @@ -1,13 +1,9 @@ package com.abin.mallchat.custom.user.websocket; -import cn.hutool.core.util.StrUtil; -import cn.hutool.core.util.URLUtil; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; -import io.netty.handler.codec.http.DefaultFullHttpRequest; import io.netty.handler.codec.http.FullHttpRequest; import io.netty.handler.codec.http.HttpHeaders; -import io.netty.util.AttributeKey; import org.apache.commons.lang3.StringUtils; import java.net.InetSocketAddress; @@ -17,27 +13,14 @@ public class HttpHeadersHandler extends ChannelInboundHandlerAdapter { @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { if (msg instanceof FullHttpRequest) { - FullHttpRequest request = (FullHttpRequest) msg; - HttpHeaders headers = request.headers(); + HttpHeaders headers = ((FullHttpRequest) msg).headers(); String ip = headers.get("X-Real-IP"); if (StringUtils.isEmpty(ip)) {//如果没经过nginx,就直接获取远端地址 InetSocketAddress address = (InetSocketAddress) ctx.channel().remoteAddress(); ip = address.getAddress().getHostAddress(); } - - String[] uriSplit = request.uri().split("[?]"); - FullHttpRequest modifiedRequest = new DefaultFullHttpRequest(request.protocolVersion(), request.method(), uriSplit[0]); - modifiedRequest.headers().add(headers); - modifiedRequest.content().writeBytes(request.content()); - - NettyUtil.setAttr(ctx.channel(), NettyUtil.IP, ip); - if (uriSplit.length>=2) { - NettyUtil.setAttr(ctx.channel(), NettyUtil.TOKEN, uriSplit[1]); - } - ctx.fireChannelRead(modifiedRequest); - }else { - super.channelRead(ctx, msg); } + ctx.fireChannelRead(msg); } } \ No newline at end of file diff --git a/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/user/websocket/NettyWebSocketServer.java b/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/user/websocket/NettyWebSocketServer.java index 4ebf470..b70b867 100644 --- a/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/user/websocket/NettyWebSocketServer.java +++ b/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/user/websocket/NettyWebSocketServer.java @@ -10,7 +10,6 @@ import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioServerSocketChannel; import io.netty.handler.codec.http.HttpObjectAggregator; import io.netty.handler.codec.http.HttpServerCodec; -import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; import io.netty.handler.stream.ChunkedWriteHandler; @@ -89,7 +88,7 @@ public class NettyWebSocketServer { * 4. WebSocketServerProtocolHandler 核心功能是把 http协议升级为 ws 协议,保持长连接; * 是通过一个状态码 101 来切换的 */ - pipeline.addLast(new WebSocketServerProtocolHandler("/")); + pipeline.addLast(new WebSocketHandshakeHandler()); // 自定义handler ,处理业务逻辑 pipeline.addLast(new NettyWebSocketServerHandler()); } diff --git a/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/user/websocket/WebSocketHandshakeHandler.java b/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/user/websocket/WebSocketHandshakeHandler.java new file mode 100644 index 0000000..bc1119f --- /dev/null +++ b/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/user/websocket/WebSocketHandshakeHandler.java @@ -0,0 +1,29 @@ +package com.abin.mallchat.custom.user.websocket; + + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; +import io.netty.handler.codec.http.FullHttpRequest; +import io.netty.handler.codec.http.websocketx.WebSocketServerHandshaker; +import io.netty.handler.codec.http.websocketx.WebSocketServerHandshakerFactory; +import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler; + +public class WebSocketHandshakeHandler extends ChannelInboundHandlerAdapter { + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + if (msg instanceof FullHttpRequest) { + FullHttpRequest request = (FullHttpRequest) msg; + String token = request.headers().get("Sec-Websocket-Protocol"); + NettyUtil.setAttr(ctx.channel(), NettyUtil.TOKEN, token); + // 构建WebSocket握手处理器 + WebSocketServerHandshakerFactory handshakeFactory = new WebSocketServerHandshakerFactory( + request.uri(), token, false); + WebSocketServerHandshaker handshake = handshakeFactory.newHandshaker(request); + handshake.handshake(ctx.channel(), request); + // 手动触发WebSocket握手状态事件 + ctx.pipeline().fireUserEventTriggered(WebSocketServerProtocolHandler.ServerHandshakeStateEvent.HANDSHAKE_COMPLETE); + } else { + super.channelRead(ctx, msg); + } + } +}