前言
作者昨天测试WebSocket连接的时候,因为WebSocket连接只能传递地址参数,所以在连接的时候,构造了一个类似于:ws://localhost:端口/WebSocket?token=xxxxx 然后就出现了服务端能显示正常连接上,但客户端就是卡着一直转圈圈,几经摸索和百度下,于是有了如下的一些思考和想法
声明:本篇文章是作者自己的构思历程,有好的想法欢迎提出,遇到错误也欢迎对作者提出斧正意见,最后转载请声明出处
问题原因
-
添加处理器的时候,添加了这么一个处理器
pipeline.addLast(new WebSocketServerProtocolHandler(nettyPath, null, true)其中nettyPath为自定义的ws连接地址,也就是/WebSocket -
连接的时候因为携带了参数与配置的
/WebSocket不同,所以遭到了拦截,问题就出在WebSocketServerProtocolHandler默认是路径全检测,所以会出现无法建立连接
解决方法
修改 WebSocketServerProtocolHandler 处理器配置默认的参数
将 allowMaskMismatch 设置为 false ,将 checkStartsWith 设置为 true
这个时候 WebSocket 连接就能正常连接了
WebSocketServerProtocolHandler处理器
虽然解决了问题,但是本着好奇心还是去了解了一下这个处理器
-
介绍:WebSocketServerProtocolHandler是Netty提供的用于处理WebSocket协议的Handler之一,它负责解析WebSocket握手请求和处理WebSocket帧,并提供了一些方便的配置选项,通俗点来讲就是对WebSocket连接进行初始化,以及对握手进行处理
-
配置参数介绍:
websocketPath:指定WebSocket握手的路径,客户端需要在此路径上发送握手请求。例如,如果该参数为"/websocket",则客户端应该发送GET /websocket HTTP/1.1请求来进行握手subprotocols:指定支持的子协议,用逗号分隔。客户端可以在握手请求中选择一个子协议,服务端可以根据此参数来选择最终使用的子协议allowExtensions:指定是否允许使用WebSocket扩展。如果设置为true,则服务端将接受客户端发送的扩展请求,否则将拒绝扩展请求maxFrameSize:指定最大的WebSocket帧大小,单位为字节。如果接收到的帧大小超过此值,将会触发CorruptedFrameException异常allowMaskMismatch:指定是否允许接收到的帧带有掩码。WebSocket协议规定客户端发送的帧必须带有掩码,但服务端发送的帧不需要带掩码。如果设置为true,则服务端将接受带有掩码的帧,否则将拒绝带有掩码的帧checkStartsWith:指定是否检查握手请求的路径是否以websocketPath开头。如果设置为true,则服务端将只接受路径以websocketPath开头的握手请求,否则将拒绝其他路径的握手请求 -
当然上述介绍都是从ai那copy过来的,相较于我这次的问题,
allowMaskMismatch参数和checkStartsWith参数,通俗点来讲就是WebSocket协议规定,客户端发送的数据帧需要进行掩码处理,以确保数据的安全性。默认情况下,allowMaskMismatch参数被设置为false,表示不允许客户端发送非掩码帧。如果要允许客户端发送非掩码帧,可以将allowMaskMismatch参数设置为true;checkStartWith就比较好理解了,就不多做赘述了
项目的思考
虽然最终解决了这个传参的问题,但我最终还是没有考虑从地址去传递 token 参数,而是设置了一个枚举类,每次发送消息获取到 type 字段为 REGISTER 的时候,再去获取 token 字段来进行 channel 的存取还有权限的校验,个人感觉通过这样的处理,让连接的处理更加完善,而且在设置消息处理的时候,继承了 SimpleChannelInboundHandler<TextWebSocketFrame> 获取的 msg 都是 TextWebSocketFrame 类型,也不太好去获取传参路径上的参数,种种方面最后选择了字段获取的方式
总结
解决一个问题对我来说最大的好处就是,窥一斑而知全豹,通过一个问题去拓展的学习一个知识点,这点才是我感觉写博客或者说是自学的魅力所在,也是我学习的意义之处
希望大家能动动小手点点关注,我不定时的分享我学习的知识历程的