博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
netty tcp(ws)鉴权2个方案
阅读量:5138 次
发布时间:2019-06-13

本文共 2924 字,大约阅读时间需要 9 分钟。

1

增加一个AuthHandler,顶在pipeline最前面

 

鉴权不通过,close channel,通过,remove掉这个鉴权channel

 

 

1.5

no remove AuthHandler

    channel.attribute.get    

    null - 是否鉴权请求

      否 close

      是 鉴权

    not null 直接放行ctx.fireChannelRead

 

 

 

2

connect时鉴权,将信息放在ws url中

前端:ws = new WebSocket(WS_URL + ";" + getCookie('token'));

 

服务端在握手前:

public class HttpRequestHandler extends SimpleChannelInboundHandler
{ private static final Logger logger = LoggerFactory.getLogger(HttpRequestHandler.class); public static AttributeKey
TOKEN = AttributeKey.valueOf("token"); public static AttributeKey
USERNAME = AttributeKey.valueOf("userName"); @Override public void channelRead0(ChannelHandlerContext ctx, FullHttpRequest request) throws Exception { String url = request.getUri(); if(-1 != url.indexOf("/ws")) { String temp [] = url.split(";"); if(temp.length >= 2) { String token = URLDecoder.decode(temp[1], "UTF-8"); ctx.channel().attr(TOKEN).set(token); } request.setUri("/ws"); // 传递到下一个handler:升级握手 ctx.fireChannelRead(request.retain()); } else { logger.error("not socket"); ctx.close(); } }

  

握手后:

public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {        if (evt == WebSocketServerProtocolHandler.ServerHandshakeStateEvent.HANDSHAKE_COMPLETE) {            // 移除性能更加            ctx.pipeline().remove(HttpRequestHandler.class);            boolean hasAuth = false;            String userName = null;            String token = ctx.channel().attr(HttpRequestHandler.TOKEN).get();            if(token == null || "".equals(token)) {                logger.warn("no token");            } else {                userName = GlobalContext.channelUser.get(token);                if(userName != null && !"".equals(userName)) {                    ctx.channel().attr(HttpRequestHandler.USERNAME).set(userName);                    hasAuth = true;                } else {                    logger.warn("no user");                }            }            if(hasAuth) {                String up = userName + "[connected]";                logger.info(up);                //    for(int i=0; i<100; ++i)                ctx.writeAndFlush(up);                group.add(ctx.channel());            } else {                String noToken = "[您的token非法,请重新登录]";                logger.warn(noToken);                ctx.writeAndFlush(noToken).addListener(new ChannelFutureListener() {                    @Override                    public void operationComplete(ChannelFuture channelFuture) throws Exception {                        channelFuture.channel().close();                    }                });            }

  

 

具体位置参见:https://www.cnblogs.com/silyvin/articles/9590595.html

转载于:https://www.cnblogs.com/silyvin/p/9663641.html

你可能感兴趣的文章
自定义分页
查看>>
你需要知道的 5 个 Linux 新手会犯的失误
查看>>
单列模式的几种写法
查看>>
html、css、js实现手风琴图片滑动
查看>>
Java 多线程基础
查看>>
(树)输出或者存储二叉树中每一行的节点值
查看>>
nginx 引入外部文件
查看>>
html 基本标签
查看>>
分页SQL技术1-COUNT STOPKEY.
查看>>
cache buffers chains latch
查看>>
牛客网暑假ACM多校第九场F-Typing pratice(AC自动机+最短路)
查看>>
【二进制枚举+LCS】Card Hand Sorting
查看>>
spring batch初识
查看>>
实验二 第二部分
查看>>
SQL语句实用技巧1
查看>>
php函数UrlEncode的C++版
查看>>
不靠广告也盈利:移动应用掘金7大案例剖析(转)
查看>>
007:Aggressive cows
查看>>
Zend Guard Loader安装教程
查看>>
hdu 5285 wyh2000 and pupil(二染色)
查看>>