java springboot websocket vue 实现发送信息

简介: java springboot websocket vue 实现发送信息

前言

此文章基于服务端对客户端发送消息教程

采用springboot websocket进行聊天

只需一个配置类就可以完成

本文采用点对点进行发送消息

maven依赖

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-websocket</artifactId>
  <version>2.4.3</version>
</dependency>

配置类

/**
 * @author wuzhenyong
 * <p>
 * WebSocket配置类
 */
@Slf4j
@Configuration
@RequiredArgsConstructor
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
  private final ResourceServerTokenServices tokenService;
  /**
   * 注册socket端点
   * @author wuzhenyong
   */
  @Override
  public void registerStompEndpoints(StompEndpointRegistry registry) {
    // 定义websocket端点,ws采用socketjs协议
    // setAllowedOriginPatterns解决跨域问题
    registry.addEndpoint("/ws").setAllowedOriginPatterns("*").withSockJS();
    registry.addEndpoint("/ws-test").setAllowedOriginPatterns("*");
  }
  /**
   * 客户端建立连接调用此方法
   * 主要作用校验用户令牌信息,如果无效token则不能建立连接
   * @author wuzhenyong
   */
  @Override
  public void configureClientInboundChannel(ChannelRegistration registration) {
    registration.interceptors(new ChannelInterceptor() {
      @Override
      public Message<?> preSend(Message<?> message, MessageChannel channel) {
        StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
        if (null == accessor) {
          return null;
        }
        // 判断是否首次连接请求
        if (!StompCommand.CONNECT.equals(accessor.getCommand())) {
          // 不是首次连接,已经成功登陆
          return message;
        }
        // 处理租户
        String tenant = accessor.getFirstNativeHeader(CommonConstants.TENANT_ID);
        if (CharSequenceUtil.isNotBlank(tenant)) {
          TenantContextHolder.setTenantId(Integer.parseInt(tenant));
        } else {
          TenantContextHolder.setTenantId(CommonConstants.TENANT_ID_1);
        }
        // 验证令牌信息
        String token = accessor.getFirstNativeHeader("Authorization");
        log.info("webSocket token is {}", token);
        if (null == token || token.length() <= 0) {
          return null;
        }
        /**
         * 以下是自定义用户令牌校验
         */
        OAuth2Authentication auth2Authentication = tokenService.loadAuthentication(token.split(" ")[1]);
        if (ObjectUtil.isNotNull(auth2Authentication)) {
          SecurityContextHolder.getContext().setAuthentication(auth2Authentication);
          accessor.setUser(auth2Authentication::getName);
          return message;
        }
        return null;
      }
    });
  }
}

服务端发送消息

// 注入,SimpMessagingTemplate 类来让开发者更加灵活地发送消息
@Autowired
private SimpMessagingTemplate simpMessagingTemplate;
// 发送消息代码
simpMessagingTemplate.convertAndSend("/test/2/1", content);
// 说明:convertAndSend(自定义通道,发送内容)
// 常用于:/发送消息前缀/用户ID/消息类型

VUE 依赖

// package.json文件 dependencies 属性下添加,然后执行npm install
"sockjs-client": "1.0.0",
"stomp-websocket": "2.3.4-next",

VUE代码

// 初始化
initWebSocket() {
      this.connection()
      const self = this
      // 断开重连机制,尝试发送消息,捕获异常发生时重连
      this.timer = setInterval(() => {
        try {
          self.stompClient.send('test')
        } catch (err) {
          console.log('断线了: ' + err)
          self.connection()
        }
      }, 5000)
    },
// 连接
connection() {
    // 传入header信息
    const token = store.getters.access_token
    const TENANT_ID = getStore({name: 'tenantId'}) ? getStore({name: 'tenantId'}) : '1'
    const headers = {
      'TENANT-ID': TENANT_ID,
      'Authorization': 'Bearer ' + token
    }
    // 建立连接对象 最后面的ws是我们定义的socketjs协议端点
    this.socket = new SockJS('ws://127.0.0.1:8080/ws')// 连接服务端提供的通信接口,连接以后才可以订阅广播消息和个人消息
    // 获取STOMP子协议的客户端对象
    this.stompClient = Stomp.over(this.socket)
    this.stompClient.debug = null
    // 向服务器发起websocket连接
    this.stompClient.connect(headers, () => {
      // 订阅通道 /test/2/1 是与服务器发送消息的通道 定义好的哦
      let target = `/test/2/1`
      this.stompClient.subscribe(target, (msg) => { // 订阅服务端提供的某个topic;
        this.$notify({
          title: '提醒',
          type: 'warning',
          dangerouslyUseHTMLString: true,
          message: msg.body + '任务,请及时处理',
          offset: 60
        })
      })
    }, (err) => {
      console.log(err)
    })
},
// 关闭连接
disconnect() {
    if (this.stompClient != null) {
      this.stompClient.disconnect()
      console.log('Disconnected')
    }
}



以上发送消息的功能就完成啦,对于此聊天方式,服务端就一个配置类就可以进行聊天了哦。



关于前端连接websocket ,后台使用网关如何解决问题

在网关配置ws协议,然后前端进行连接的时候直接填写网关配置信息+/ws(/ws就是服务端创建的端点),也就是http协议也可以连接哦




五一专属|向所有热爱分享的“技术劳动者”致敬#


相关文章
|
1月前
|
安全 算法 Java
在Spring Boot中应用Jasypt以加密配置信息。
通过以上步骤,可以在Spring Boot应用中有效地利用Jasypt对配置信息进行加密,这样即使配置文件被泄露,其中的敏感信息也不会直接暴露给攻击者。这是一种在不牺牲操作复杂度的情况下提升应用安全性的简便方法。
575 10
|
2月前
|
Java 数据库连接 API
Java 8 + 特性及 Spring Boot 与 Hibernate 等最新技术的实操内容详解
本内容涵盖Java 8+核心语法、Spring Boot与Hibernate实操,按考试考点分类整理,含技术详解与代码示例,助力掌握最新Java技术与应用。
92 2
|
2月前
|
人工智能 安全 Java
Spring Boot yml 配置敏感信息加密
本文介绍了如何在 Spring Boot 项目中使用 Jasypt 实现配置文件加密,包含添加依赖、配置密钥、生成加密值、在配置中使用加密值及验证步骤,并提供了注意事项,确保敏感信息的安全管理。
703 1
|
3月前
|
Java 数据库连接 API
Java 对象模型现代化实践 基于 Spring Boot 与 MyBatis Plus 的实现方案深度解析
本文介绍了基于Spring Boot与MyBatis-Plus的Java对象模型现代化实践方案。采用Spring Boot 3.1.2作为基础框架,结合MyBatis-Plus 3.5.3.1进行数据访问层实现,使用Lombok简化PO对象,MapStruct处理对象转换。文章详细讲解了数据库设计、PO对象实现、DAO层构建、业务逻辑封装以及DTO/VO转换等核心环节,提供了一个完整的现代化Java对象模型实现案例。通过分层设计和对象转换,实现了业务逻辑与数据访问的解耦,提高了代码的可维护性和扩展性。
147 1
|
3月前
|
Java 调度 流计算
基于Java 17 + Spring Boot 3.2 + Flink 1.18的智慧实验室管理系统核心代码
这是一套基于Java 17、Spring Boot 3.2和Flink 1.18开发的智慧实验室管理系统核心代码。系统涵盖多协议设备接入(支持OPC UA、MQTT等12种工业协议)、实时异常检测(Flink流处理引擎实现设备状态监控)、强化学习调度(Q-Learning算法优化资源分配)、三维可视化(JavaFX与WebGL渲染实验室空间)、微服务架构(Spring Cloud构建分布式体系)及数据湖建设(Spark构建实验室数据仓库)。实际应用中,该系统显著提升了设备调度效率(响应时间从46分钟降至9秒)、设备利用率(从41%提升至89%),并大幅减少实验准备时间和维护成本。
240 0
|
3月前
|
Java API 微服务
Java 21 与 Spring Boot 3.2 微服务开发从入门到精通实操指南
《Java 21与Spring Boot 3.2微服务开发实践》摘要: 本文基于Java 21和Spring Boot 3.2最新特性,通过完整代码示例展示了微服务开发全流程。主要内容包括:1) 使用Spring Initializr初始化项目,集成Web、JPA、H2等组件;2) 配置虚拟线程支持高并发;3) 采用记录类优化DTO设计;4) 实现JPA Repository与Stream API数据访问;5) 服务层整合虚拟线程异步处理和结构化并发;6) 构建RESTful API并使用Springdoc生成文档。文中特别演示了虚拟线程配置(@Async)和StructuredTaskSco
365 0
|
2月前
|
安全 算法 Java
Java 多线程:线程安全与同步控制的深度解析
本文介绍了 Java 多线程开发的关键技术,涵盖线程的创建与启动、线程安全问题及其解决方案,包括 synchronized 关键字、原子类和线程间通信机制。通过示例代码讲解了多线程编程中的常见问题与优化方法,帮助开发者提升程序性能与稳定性。
119 0