热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

netty+websocket模式下token身份验证遇到的问题

转https:blog.csdn.netalwaysRisearticledetails121002198netty+websocket下pipeline中handler无法传递的

转https://blog.csdn.net/alwaysRise/article/details/121002198

netty+websocket下pipeline中handler无法传递的问题
在ChannelPipeline中责任链的传递

点击查看代码
ChannelPipeline pipeline = socketChannel.pipeline();

//websocket协议本身是基于http协议的,所以这边也要使用http解编码器
pipeline.addLast(new HttpServerCodec());
//以块的方式来写的处理器
pipeline.addLast(new ChunkedWriteHandler());
//netty是基于分段请求的,HttpObjectAggregator的作用是将请求分段再聚合,参数是聚合字节的最大长度
pipeline.addLast(new HttpObjectAggregator(8192));

//        pipeline.addLast(new ReadTimeoutHandler(60));

pipeline.addLast(httpRequestHandler);
//ws://server:port/context_path
//ws://localhost:9999/ws
//参数指的是contex_path
pipeline.addLast(new WebSocketServerProtocolHandler("/xdong",true));

//websocket定义了传递数据的6中frame类型
pipeline.addLast(xdongTextWebSocketFrameHandler);

在责任链中有两个我自定义的handler,分别是httpRequestHandler和xdongTextWebSocketFrameHandler,这两个handler的作用分别是处理http请求下的token身份验证和完成握手升级以及处理握手完成之后接收ws客户端传入的消息。

但是在我的代码过程中发生了问题,客户端能成功和服务器建立通道,但是却无法完成后续的消息传输,网上在线的ws测试客户端和我的服务端建立连接的时候也提示未收到服务端的握手包。

经过大佬的排查发现我在我的handler中并没有通过fire时间将消息给责任链中的下一个handler处理,实际上我虽然建立了通道但是却没有完成握手,更无法处理消息。

其中三个重要的handler在责任链中的顺序是这样的:

点击查看代码
pipeline.addLast(httpRequestHandler);
//ws://server:port/context_path
//ws://localhost:9999/ws
//参数指的是contex_path
pipeline.addLast(new WebSocketServerProtocolHandler("/xdong",true));

//websocket定义了传递数据的6中frame类型
pipeline.addLast(xdongTextWebSocketFrameHandler);

httpRequestHandler这个handler放第一个的原因是第一次握手的时候,请求实际上还是个http请求, 我可以拿到url中的token完成身份验证的工作。但是完成了之后还需要调用下一个handler完成http到ws协议的升级。

WebSocketServerProtocolHandler这个handler是io.netty包中自带的handler用来完成http协议到websocket协议的升级, 并且明确提到消息处理的handler必须在该handler之后。
netty+websocket模式下token身份验证遇到的问题
xdongTextWebSocketFrameHandler是一个消息处理的handler,在成功建立ws连接后用来接收客户端传输的消息。

在pipeLine中的加入顺序都是addLast, 所以都是有顺序的。在channelRead0方法中处理完当前的逻辑之后需要通过fire事件触发下一个InboundHandler。方法就是ctx.fireChannelRead(((FullHttpRequest) msg).retain())
@Override protected void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception { if (msg instanceof FullHttpRequest) { handleHttpRequest(ctx, (FullHttpRequest) msg); ctx.fireChannelRead(((FullHttpRequest) msg).retain()); } else if (msg instanceof WebSocketFrame) { ctx.fireChannelRead(((WebSocketFrame) msg).retain()); } }


推荐阅读
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • 图像因存在错误而无法显示 ... [详细]
  • Monkey《大话移动——Android与iOS应用测试指南》的预购信息发布啦!
    Monkey《大话移动——Android与iOS应用测试指南》的预购信息已经发布,可以在京东和当当网进行预购。感谢几位大牛给出的书评,并呼吁大家的支持。明天京东的链接也将发布。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
author-avatar
浪子得意_357
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有