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 {

    @OnOpen
    public 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 {

    @Override
    public 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;
    }

    @Override
    public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) {
        // 握手完成后的处理逻辑(可选)
    }
}

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

@Configuration
@EnableWebSocket
public class SpringSocketConfig implements WebSocketConfigurer {

    @Autowired
    private SpringSocketHandle springSocketHandle;

    @Autowired
    private SpringAbstractWebSocketHandler springAbstractWebSocketHandler;

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(springSocketHandle, "/spring-ws").setAllowedOrigins("*")
                .addHandler(springAbstractWebSocketHandler, "/spring-ws1").addInterceptors(new IdHandshakeInterceptor()).setAllowedOrigins("*");
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值