SockJS中_generateSessionId生成与_transport._url解析的sessionId有何区别
SockJS两类Session ID的区别与有效性说明
从sockJs._transport._url中解析得到的、类似zf2j9qxe的字符串才是和服务端绑定、真实生效的会话ID,二者的核心区别如下:
- 第一类:通过
_generateSessionId()方法获取的值
这个是SockJS客户端实例初始化阶段生成的临时候选ID,_generateSessionId本身是SockJS客户端约定的私有方法(下划线前缀代表非公开API),生成的ID仅作为传输协商阶段的候选参数提交给服务端,不会直接作为最终会话绑定依据。
实例创建代码如下:const sockJs = new SockJs('http://example.com/ws/api') - 第二类:从
sockJs._transport._url中解析的ID
这个是SockJS客户端和服务端完成传输协议协商之后,服务端最终确认返回的正式会话ID,会作为后续所有帧传输的身份标识,和服务端存储的会话上下文完全绑定,是实际生效的ID。
对应的传输url格式示例如下:ws://example.com/ws/api/333/zf2j9qxe/websocket
二者不一致的原因
SockJS会话协商流程中,客户端生成的候选ID仅用于发起协商请求,服务端会做合法性校验:如果候选ID无冲突且符合服务端规则就会复用,否则服务端会返回自行生成的正式ID,写入后续的传输url中,就会出现和客户端初始生成的候选ID不一致的情况。
注意:
_generateSessionId、_transport均为SockJS客户端的非公开私有成员,不同版本实现可能存在差异,不建议在生产代码中直接依赖这些私有属性获取会话ID,如有需要建议在业务层通过WebSocket消息主动从服务端获取正式会话ID,兼容性更强。
内容的提问来源于stack exchange,提问作者Anubhav Pandey
相关产品推荐
相关产品推荐

