|
|
@@ -0,0 +1,49 @@
|
|
|
+package com.zksy.server;
|
|
|
+
|
|
|
+import io.netty.channel.ChannelHandlerContext;
|
|
|
+import io.netty.channel.ChannelInboundHandlerAdapter;
|
|
|
+import io.netty.handler.codec.http.FullHttpRequest;
|
|
|
+import io.netty.handler.codec.http.QueryStringDecoder;
|
|
|
+import lombok.RequiredArgsConstructor;
|
|
|
+import org.springframework.data.redis.core.RedisTemplate;
|
|
|
+
|
|
|
+@RequiredArgsConstructor
|
|
|
+public class AuthHandshakeHandler extends ChannelInboundHandlerAdapter {
|
|
|
+
|
|
|
+ private final RedisTemplate<Object, Object> redisTemplate;
|
|
|
+
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
|
|
|
+ if (msg instanceof FullHttpRequest) {
|
|
|
+ FullHttpRequest request = (FullHttpRequest) msg;
|
|
|
+
|
|
|
+ // 方法1: 从URL参数中获取token进行验证
|
|
|
+ QueryStringDecoder decoder = new QueryStringDecoder(request.uri());
|
|
|
+ String token = decoder.parameters().get("token") != null ?
|
|
|
+ decoder.parameters().get("token").get(0) : null;
|
|
|
+ if (isValidToken(token)) {
|
|
|
+ // 验证通过,继续处理
|
|
|
+ super.channelRead(ctx, msg);
|
|
|
+ } else {
|
|
|
+ // 验证失败,关闭连接
|
|
|
+ ctx.close();
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // 非HTTP请求消息,直接传递
|
|
|
+ super.channelRead(ctx, msg);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 验证token的有效性
|
|
|
+ * @param token
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private boolean isValidToken(String token) {
|
|
|
+ Object count = redisTemplate.opsForValue().get("ws:token:" + token);
|
|
|
+
|
|
|
+ return count != null && (Integer) count > 0;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|