WebSocket连接传参和WebSocketServerProtocolHandler处理器

1,023 阅读4分钟

前言

作者昨天测试WebSocket连接的时候,因为WebSocket连接只能传递地址参数,所以在连接的时候,构造了一个类似于:ws://localhost:端口/WebSocket?token=xxxxx 然后就出现了服务端能显示正常连接上,但客户端就是卡着一直转圈圈,几经摸索和百度下,于是有了如下的一些思考和想法

声明:本篇文章是作者自己的构思历程,有好的想法欢迎提出,遇到错误也欢迎对作者提出斧正意见,最后转载请声明出处

问题原因

  1. 添加处理器的时候,添加了这么一个处理器 pipeline.addLast(new WebSocketServerProtocolHandler(nettyPath, null, true) 其中 nettyPath 为自定义的 ws 连接地址,也就是 /WebSocket

  2. 连接的时候因为携带了参数与配置的 /WebSocket 不同,所以遭到了拦截,问题就出在 WebSocketServerProtocolHandler 默认是路径全检测,所以会出现无法建立连接

解决方法

修改 WebSocketServerProtocolHandler 处理器配置默认的参数 将 allowMaskMismatch 设置为 false ,将 checkStartsWith 设置为 true 这个时候 WebSocket 连接就能正常连接了

WebSocketServerProtocolHandler处理器

虽然解决了问题,但是本着好奇心还是去了解了一下这个处理器

  1. 介绍:WebSocketServerProtocolHandler是Netty提供的用于处理WebSocket协议的Handler之一,它负责解析WebSocket握手请求和处理WebSocket帧,并提供了一些方便的配置选项,通俗点来讲就是对WebSocket连接进行初始化,以及对握手进行处理

  2. 配置参数介绍: websocketPath:指定WebSocket握手的路径,客户端需要在此路径上发送握手请求。例如,如果该参数为"/websocket",则客户端应该发送GET /websocket HTTP/1.1请求来进行握手

    subprotocols:指定支持的子协议,用逗号分隔。客户端可以在握手请求中选择一个子协议,服务端可以根据此参数来选择最终使用的子协议

    allowExtensions:指定是否允许使用WebSocket扩展。如果设置为true,则服务端将接受客户端发送的扩展请求,否则将拒绝扩展请求

    maxFrameSize:指定最大的WebSocket帧大小,单位为字节。如果接收到的帧大小超过此值,将会触发CorruptedFrameException异常

    allowMaskMismatch:指定是否允许接收到的帧带有掩码。WebSocket 协议规定客户端发送的帧必须带有掩码,但服务端发送的帧不需要带掩码。如果设置为true,则服务端将接受带有掩码的帧,否则将拒绝带有掩码的帧

    checkStartsWith:指定是否检查握手请求的路径是否以websocketPath开头。如果设置为true,则服务端将只接受路径以websocketPath开头的握手请求,否则将拒绝其他路径的握手请求

  3. 当然上述介绍都是从ai那copy过来的,相较于我这次的问题,allowMaskMismatch 参数和 checkStartsWith 参数,通俗点来讲就是 WebSocket 协议规定,客户端发送的数据帧需要进行掩码处理,以确保数据的安全性。默认情况下,allowMaskMismatch 参数被设置为false,表示不允许客户端发送非掩码帧。如果要允许客户端发送非掩码帧,可以将 allowMaskMismatch 参数设置为truecheckStartWith 就比较好理解了,就不多做赘述了

项目的思考

虽然最终解决了这个传参的问题,但我最终还是没有考虑从地址去传递 token 参数,而是设置了一个枚举类,每次发送消息获取到 type 字段为 REGISTER 的时候,再去获取 token 字段来进行 channel 的存取还有权限的校验,个人感觉通过这样的处理,让连接的处理更加完善,而且在设置消息处理的时候,继承了 SimpleChannelInboundHandler<TextWebSocketFrame> 获取的 msg 都是 TextWebSocketFrame 类型,也不太好去获取传参路径上的参数,种种方面最后选择了字段获取的方式

总结

解决一个问题对我来说最大的好处就是,窥一斑而知全豹,通过一个问题去拓展的学习一个知识点,这点才是我感觉写博客或者说是自学的魅力所在,也是我学习的意义之处

希望大家能动动小手点点关注,我不定时的分享我学习的知识历程的