当前位置: 首页 > news >正文

websocket 接收消息无法获取用户id

1.遇到问题 

        公司项目是基于ruoyi 框架快速搭建开发,使用多线程搜索查询,所以以用户区分任务,保证可以搜索任务和取消搜索,所以我这需要获得用户id,使用 SecurityUtils 共工工具类从请求头获取token,然后解析得到用户基本信息和权限。在开发的过程中正常使用,建立socket连接也正常,但是在后续发消息的时候,在后续将代码移动websocket 出现获取用户ID 异常的错误,其实在获取 loginUser 是空的。

/*** 安全服务工具类* * @author trinity*/
public class SecurityUtils
{/*** 用户ID**/public static Long getUserId(){try{return getLoginUser().getUserId();}catch (Exception e){throw new ServiceException("获取用户ID异常", HttpStatus.UNAUTHORIZED);}}

  2.解决思路

        1.同事告诉我可以采用另外一种方式,建立连接的时候将让前端传过来,让后将userId和session存放一起,以下代码就可以实现。

@Slf4j
@Component
@ServerEndpoint(value = "/websocket/{userid}")
public class SearchSocketServer {@OnOpenpublic void onOpen(Session session, @PathParam("userid") String userid) {log.info("WebSocket connection opened for userid: {}", userid);// 处理其他逻辑...}
}

        上面是基于注解开发,实现起来的简单。我也问了前端同事是否可以我传用户id,回答也是是。我这人就是最求代码高bi格,就使用下面了这种

        实现 HandshakeInterceptor 接口 就能在 websocket 三次握手 四次挥手 (至于websocket用的什么不清楚),因为socket 建立其实发消息其实就不会发请求了,也就是我在代码中获取不到用户id的问题所在。所以我只要在建立socket 请求时获取用户id 写到请求头里后面就可以无限使用了。不知道还有没有更好的方式

/*** @author LJL* @version 1.0* @title IdHandshakeInterceptor* @date 2023/8/25 9:18* @description TODO*/
public class IdHandshakeInterceptor  implements HandshakeInterceptor {@Overridepublic boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {// 从外部请求中获取id,并设置到WebSocket的属性中Long uid = SecurityUtils.getUserId();attributes.put("uid", uid);return true;}@Overridepublic void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) {// 握手完成后的处理逻辑(可选)}
}

        实现了拦截器别忘记添加进去 

@Configuration
@EnableWebSocket
public class SpringSocketConfig implements WebSocketConfigurer {@Autowiredprivate SpringSocketHandle springSocketHandle;@Autowiredprivate SpringAbstractWebSocketHandler springAbstractWebSocketHandler;@Overridepublic void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {registry.addHandler(springSocketHandle, "/spring-ws").setAllowedOrigins("*").addHandler(springAbstractWebSocketHandler, "/spring-ws1").addInterceptors(new IdHandshakeInterceptor()).setAllowedOrigins("*");}
http://www.lryc.cn/news/140593.html

相关文章:

  • springboot通过sharding-dbc按年、月分片
  • 基于静电放电算法优化的BP神经网络(预测应用) - 附代码
  • 开发者插件推荐FeHelper
  • 【MySQL】JSON 格式字段处理
  • 数据库选型<1>
  • 1.Flink源码编译
  • Linux内核数据结构 散列表
  • 数据库系统课设——基于python+pyqt5+mysql的酒店管理系统(可直接运行)--GUI编程
  • 《C和指针》笔记9: typedef
  • 《C和指针》笔记6:gets/puts/scanf/printf/getchar函数用法
  • 智慧课堂学生行为检测评估算法
  • rainbond云原生应用管理平台部署
  • jemter连接数据json断言
  • JavaFX 加载 fxml 文件
  • (三)Redis——Set
  • Vue组件通信方式详解(全面版)
  • 什么是Promise对象?它的状态有哪些?如何使用Promise处理异步操作?以及 async、await
  • Android 之自定义绘制一
  • vue3 计算两个表单得到第三个表单数据
  • Premiere Pro软件安装包分享(附安装教程)
  • springboot设置文件上传大小,默认是1mb
  • Unity 之transform.LookAt() 调整一个物体的旋转,使其朝向指定的位置
  • linux————haproxy
  • 【80天学习完《深入理解计算机系统》】第十天 3.3 条件码寄存器【CF ZF SF OF】【set】
  • 使用WSL修改docker文件存储位置
  • 软件设计师学习笔记6-存储系统
  • 【TI毫米波雷达笔记】CCS雷达工程内存RAM指定(DATA_SECTION,以IWR6843AOP为例)
  • 安卓移动应用开发实训室建设方案
  • 我的编程学习过程
  • 亚马逊云科技 云技能孵化营 初识机器学习