Netty权限控制的一些想法

大家好, 我是Open, 是一位新进的掘金作家, 今天我带来的是Netty的教程, 如果大家感觉我写的不错可以点点赞👍, 好了我们废话不多说, 直接开始操作。

本次使用的版本如下:

  • SpringBoot: 2.5.17
  • Netty: 4.1.101

前提描述:

1、Netty提供了WebSocket的适配, 通过netty可以更好的完成websocket的工作, 但是我们应该如何对每次访问socket的部分信息添加权限内容呢, 如果缺失权限我们应该如何去做,我们应该如何添加权限呢, 这是我们这次需要考虑的。

2、本次讲解操作只使用与WebSocket协议, TCP与UDP权限需自己控制, OK让我们进下一步操作

3、先上图, 让我们来看一下WebSocket、TCP、UDP 的不同之处吧!!

此处图片引用地址为: www.cnblogs.com/ghj1976/p/4...

4、说实话我其实不知道讲什么, 所以直接上代码吧!!!!!

Netty启动部分

ini 复制代码
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
    ServerBootstrap b = new ServerBootstrap();
    b.group(bossGroup, workerGroup)
     .channel(NioServerSocketChannel.class)
     .childHandler(new WebSocketServer(sslCtx));
    Channel ch = b.bind(PORT).sync().channel();

ChildHandler实现

java 复制代码
private final SslContext sslCtx;

public WebSocketServer(SslContext sslCtx) {
    this.sslCtx = sslCtx;
}

@Override
public void initChannel(Channel ch) throws Exception {

    ChannelPipeline pipeline = ch.pipeline();
    if (sslCtx != null) {
        pipeline.addLast(sslCtx.newHandler(ch.alloc()));
    }
    pipeline.addLast(new HttpServerCodec());
    pipeline.addLast(new HttpObjectAggregator(65536));
    pipeline.addLast(new WebSocketHeadIndex());

    pipeline.addLast(new WebSocketServerProtocolHandler(WEBSOCKET_PATH, null, true));
    pipeline.addLast(new WebSocketHandler());

}

补充点

这里说明一下ChildHandler下的两个内容吧

1、WebSocketHeadIndex ---> 这个内容是一个处理器, 是处理首次连接时解析的信息

2、WebSocketHandler ---> 这个处理器是后续连接后, 要处理的内容

WebSocketHeadIndex实现

java 复制代码
private final static AttributeKey<Object> TOKEN = AttributeKey.valueOf("TOKEN");

@Override
protected void channelRead0(ChannelHandlerContext ctx, FullHttpRequest req) throws Exception {

    ......忽略一下其他URL或Method
    
    // 获取Token并绑定到Channel中
    String token = ""; 
    ctx.channel().attr(TOKEN).set(token);
}

WebSocketHandler实现

java 复制代码
private final static AttributeKey<Object> TOKEN = AttributeKey.valueOf("TOKEN");

@Override
protected void channelRead0(ChannelHandlerContext ctx, FullHttpRequest req) throws Exception {
    String = ctx.channel().attr(MN_CODE).get();
}

扩展一下

1、 每次消息发送后, 建立消息工厂, 将消息发送到消息工厂对自己的Msg进行反序列

2、 再消息工厂后, 发布到每一个消息处理器中时, 再消息处理器方法上添加AOP注解, 对消息进行验证, 是否存在权限

3、 可以拆卸的消息体, 如果是部分内容, 可以做可拆卸的消息体

最后

我是Open, 这一次的讲解更多的是思路, 如果思路相通了, 那我们后续的工作就简单了, 这里建议大家去阅读一本书籍《Netty实战》, 该书籍中详细的讲解了4.+版本的所有内容。 像是如何处理粘包粘包, 如何拆卸处理器, 如何再Channel内锁定内容, 已经通道完成后的定时任务、 心跳机制等等。

最后的最后, 我推荐一下我的个人博客 www.openacloud.com ,后续的内容我会在我的博客中进行更新!

相关推荐
追逐时光者5 小时前
推荐 12 款开源美观、简单易用的 WPF UI 控件库,让 WPF 应用界面焕然一新!
后端·.net
Jagger_5 小时前
敏捷开发流程-精简版
前端·后端
苏打水com6 小时前
数据库进阶实战:从性能优化到分布式架构的核心突破
数据库·后端
间彧7 小时前
Spring Cloud Gateway与Kong或Nginx等API网关相比有哪些优劣势?
后端
间彧7 小时前
如何基于Spring Cloud Gateway实现灰度发布的具体配置示例?
后端
间彧7 小时前
在实际项目中如何设计一个高可用的Spring Cloud Gateway集群?
后端
间彧7 小时前
如何为Spring Cloud Gateway配置具体的负载均衡策略?
后端
间彧7 小时前
Spring Cloud Gateway详解与应用实战
后端
EnCi Zheng9 小时前
SpringBoot 配置文件完全指南-从入门到精通
java·spring boot·后端
烙印6019 小时前
Spring容器的心脏:深度解析refresh()方法(上)
java·后端·spring