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 ,后续的内容我会在我的博客中进行更新!

相关推荐
罗政2 小时前
[附源码]超简洁个人博客网站搭建+SpringBoot+Vue前后端分离
vue.js·spring boot·后端
拾光师3 小时前
spring获取当前request
java·后端·spring
Java小白笔记5 小时前
关于使用Mybatis-Plus 自动填充功能失效问题
spring boot·后端·mybatis
JOJO___7 小时前
Spring IoC 配置类 总结
java·后端·spring·java-ee
白总Server7 小时前
MySQL在大数据场景应用
大数据·开发语言·数据库·后端·mysql·golang·php
Lingbug9 小时前
.Net日志组件之NLog的使用和配置
后端·c#·.net·.netcore
计算机学姐9 小时前
基于SpringBoot+Vue的篮球馆会员信息管理系统
java·vue.js·spring boot·后端·mysql·spring·mybatis
好兄弟给我起把狙9 小时前
[Golang] Select
开发语言·后端·golang
程序员大金9 小时前
基于SpringBoot+Vue+MySQL的智能物流管理系统
java·javascript·vue.js·spring boot·后端·mysql·mybatis
ac-er888810 小时前
在Flask中处理后台任务
后端·python·flask