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

若依集成WebSocket

导入包:

    <dependency>
            <groupId>io.reactivex.rxjava3</groupId>
            <artifactId>rxjava</artifactId>
            <version>3.1.8</version>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>
  1. security放开websocket的连接
  2. 设置拦截器,拦截用户信息
@Component
@EnableWebSocketMessageBroker
@Order(Ordered.HIGHEST_PRECEDENCE+99)
public class wsConfig implements WebSocketMessageBrokerConfigurer {
    @Autowired
    ISysUserService sysUserService;


    private static long HEART_BEAT = 10000;
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/ws")
                .setAllowedOrigins("*");
//                .setAllowedOriginPatterns("*")

//                .withSockJS();
    }


    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        ThreadPoolTaskScheduler te = new ThreadPoolTaskScheduler();
        te.setPoolSize(1);
        te.setThreadNamePrefix("wss-heartbeat-thread");
        te.initialize();

        registry.enableSimpleBroker("/topic","/queue")
//                .setHeartbeatValue()
                .setHeartbeatValue(new long[]{HEART_BEAT,HEART_BEAT})
                .setTaskScheduler(te);


    }


    @Override
    public void configureClientInboundChannel(ChannelRegistration registration) {
        ChannelInterceptor interceptor = new ChannelInterceptor(){
            @Override
            public Message<?> preSend(Message<?> message, MessageChannel channel) {
                StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
                if(accessor == null || accessor.getCommand() == null){
                    return null;
                }

                if (StompCommand.CONNECT.equals(accessor.getCommand())){
                    // 处理连接的请求
                    String token = accessor.getFirstNativeHeader("Authorization");

                    SysUser user = sysUserService.selectUserById(1L);
                    LoginUser loginUser = new LoginUser();
                    BeanUtils.copyProperties(user,loginUser);

                    UsernamePasswordAuthenticationToken principal = new UsernamePasswordAuthenticationToken(loginUser, null, Collections.EMPTY_LIST);

//                    UserContextHolder.set(user);
                    accessor.setUser(principal);
                }else{
                    // 其他的请求,token只用设置一次
//                    SysUser user = sysUserService.selectUserById(1L);
//                    UserContextHolder.set(user);

                    System.out.println("other请求");
                    Authentication authentication = (Authentication) accessor.getUser();
                    LoginUser loginUser = (LoginUser) authentication.getPrincipal();
                    System.out.println("loginUser111 = " + loginUser);
                }

                return message;
            }


        };

        registration.interceptors(interceptor);
    }
}

  1. 请求获取用户信息
   @MessageMapping("/send")
    public void sendMessage(Message<?> message, com.cj.project.ws.model.Message messageBody){
        System.out.println("message = " + message);

        StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
        Principal principal = accessor.getUser();
        Authentication authentication = (Authentication) principal;
        Object user = authentication.getPrincipal();
        System.out.println("user = " + user);
        System.out.println(user instanceof LoginUser);
        if (user instanceof LoginUser){
            LoginUser loginUser = (LoginUser) user;
            System.out.println("loginUser = " + loginUser);
        }

        Object payload = message.getPayload();
        System.out.println("payload = " + payload);
        System.out.println("payload = " + new String((byte[]) payload));

        System.out.println("messageBody = " + messageBody);
        String messageBodyTo = messageBody.getTo();
        System.out.println("messageBodyTo = " + messageBodyTo);


        this.pushMessage();

    }

在这里插入图片描述
心跳推送,send到/heartbeat

引用:https://juejin.cn/post/7345310754470821922
引用:https://blog.csdn.net/print_helloword/article/details/142816204
https://blog.csdn.net/2301_80817413/article/details/139561814
https://blog.csdn.net/qq_45032714/article/details/112261976

相关文章:

  • 如何在 GitHub 中创建一个空目录 ?
  • 如何提高网站在百度中的权重?
  • 使用OBS和nginx实现直播流
  • VUE 集成高德地图部署到nginx后打开不了,控制台报错
  • TypeScript语言的云计算
  • js考核第五题
  • JavaEE-SpringBoot快速入门
  • 【再读】2501.12948/DeepSeek-R1通过强化学习提升大型语言模型(LLMs)的推理能力
  • C++函数指针与回调函数详解:从青铜到王者,一文搞懂`std::function`的降维打击!
  • PVE使用一个物理网卡采用VLAN为管理IP和VM分配网络的问题
  • 【MYSQL】视图
  • 蓝桥杯小白打卡第五天
  • 什么是算法的空间复杂度和时间复杂度,分别怎么衡量。
  • 【故障处理】- 执行命令crsctl query crs xxx一直hang
  • 采用分布式部署deepseek
  • Ubuntu 下 nginx-1.24.0 源码分析 - ngx_memalign函数
  • van-field的maxlength属性为空会导致输入框的值被清空。
  • SSML语音合成标记语言开发指南:从基础语法到实战案例解析
  • [250217] x-cmd 发布 v0.5.3:新增 DeepSeek AI 模型支持及飞书/钉钉群机器人 Webhook 管理
  • windows 设置poppler
  • 宜昌打造“算力之都”:产业链快速延伸,追逐千亿级产值
  • 怒江州委常委、泸水市委书记余剑锋调任云南省委省直机关工委副书记
  • 日月谭天丨赖清德强推“脱中入北”是把台湾带向死路
  • 亮剑浦江丨上海网信部门处罚一批医疗服务类互联网企业,三大类问题值得关注
  • 商务部:4月份以来的出口总体延续平稳增长态势
  • 在差异中建共鸣,《20世纪美国文学思想研究》丛书出版