SpringBoot3+Vue3打造实时聊天室

SpringBoot3 + WebSocket + Vue3 + TypeScript 实现在线聊天室

技术栈简介

后端采用SpringBoot3集成WebSocket实现实时通信,前端使用Vue3+TypeScript构建响应式界面。该方案具有低延迟、全双工通信特性,适合需要实时交互的场景。

后端实现(SpringBoot3)

WebSocket配置类

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
    
    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(new ChatHandler(), "/ws/chat")
               .setAllowedOrigins("*");
    }
}

消息处理器

public class ChatHandler extends TextWebSocketHandler {
    private static final Set<WebSocketSession> sessions = 
        Collections.synchronizedSet(new HashSet<>());

    @Override
    public void afterConnectionEstablished(WebSocketSession session) {
        sessions.add(session);
    }

    @Override
    protected void handleTextMessage(WebSocketSession session, 
                                   TextMessage message) {
        for (WebSocketSession s : sessions) {
            s.sendMessage(message);
        }
    }
}

前端实现(Vue3 + TypeScript)

WebSocket连接管理

const socket = ref<WebSocket|null>(null)
const messages = ref<Message[]>([])

const connect = () => {
  socket.value = new WebSocket('ws://localhost:8080/ws/chat')
  
  socket.value.onmessage = (event) => {
    messages.value.push(JSON.parse(event.data))
  }
}

消息发送组件

<template>
  <div>
    <input v-model="inputMsg" @keyup.enter="send"/>
    <button @click="send">Send</button>
  </div>
</template>

<script setup lang="ts">
const inputMsg = ref('')
const send = () => {
  if (socket.value?.readyState === WebSocket.OPEN) {
    socket.value.send(JSON.stringify({
      content: inputMsg.value,
      timestamp: new Date()
    }))
    inputMsg.value = ''
  }
}
</script>

关键实现细节

跨域处理 SpringBoot需配置CORS:

@Bean
public CorsFilter corsFilter() {
    UrlBasedCorsConfigurationSource source = 
        new UrlBasedCorsConfigurationSource();
    CorsConfiguration config = new CorsConfiguration();
    config.addAllowedOrigin("*");
    source.registerCorsConfiguration("/**", config);
    return new CorsFilter(source);
}

心跳检测 前端需定时发送ping消息:

setInterval(() => {
  if (socket.value?.readyState === WebSocket.OPEN) {
    socket.value.send(JSON.stringify({ type: 'PING' }))
  }
}, 30000)

部署注意事项

  1. Nginx需配置WebSocket代理:
location /ws/ {
    proxy_pass http://backend;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}
  1. 生产环境建议添加STOMP协议支持:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketStompConfig 
    implements WebSocketMessageBrokerConfigurer {
    
    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/topic");
        config.setApplicationDestinationPrefixes("/app");
    }
}

完整源码结构

chat-app/
├── backend/
│   ├── src/main/java/com/example/
│   │   ├── config/WebSocketConfig.java
│   │   ├── handler/ChatHandler.java
│   ├── pom.xml
└── frontend/
    ├── src/
    │   ├── components/ChatWindow.vue
    │   ├── composables/useWebSocket.ts
    ├── vite.config.ts

该实现包含基础消息收发、用户连接管理等功能模块,可根据需求扩展用户认证、消息持久化等特性。实际部署时建议结合Redis实现分布式会话管理。

BbS.okacop040.info/PoSt/1120_244815.HtM
BbS.okacop041.info/PoSt/1120_190686.HtM
BbS.okacop042.info/PoSt/1120_046686.HtM
BbS.okacop043.info/PoSt/1120_222061.HtM
BbS.okacop044.info/PoSt/1120_970828.HtM
BbS.okacop045.info/PoSt/1120_758651.HtM
BbS.okacop046.info/PoSt/1120_661661.HtM
BbS.okacop047.info/PoSt/1120_305163.HtM
BbS.okacop048.info/PoSt/1120_759203.HtM
BbS.okacop049.info/PoSt/1120_043522.HtM
BbS.okacop040.info/PoSt/1120_853985.HtM
BbS.okacop041.info/PoSt/1120_507211.HtM
BbS.okacop042.info/PoSt/1120_793913.HtM
BbS.okacop043.info/PoSt/1120_510964.HtM
BbS.okacop044.info/PoSt/1120_874010.HtM
BbS.okacop045.info/PoSt/1120_552779.HtM
BbS.okacop046.info/PoSt/1120_504240.HtM
BbS.okacop047.info/PoSt/1120_581671.HtM
BbS.okacop048.info/PoSt/1120_980611.HtM
BbS.okacop049.info/PoSt/1120_530587.HtM
BbS.okacop040.info/PoSt/1120_737946.HtM
BbS.okacop041.info/PoSt/1120_534447.HtM
BbS.okacop042.info/PoSt/1120_338550.HtM
BbS.okacop043.info/PoSt/1120_663923.HtM
BbS.okacop044.info/PoSt/1120_913987.HtM
BbS.okacop045.info/PoSt/1120_165350.HtM
BbS.okacop046.info/PoSt/1120_000235.HtM
BbS.okacop047.info/PoSt/1120_089273.HtM
BbS.okacop048.info/PoSt/1120_760856.HtM
BbS.okacop049.info/PoSt/1120_768589.HtM
BbS.okacop040.info/PoSt/1120_712307.HtM
BbS.okacop041.info/PoSt/1120_428715.HtM
BbS.okacop042.info/PoSt/1120_279046.HtM
BbS.okacop043.info/PoSt/1120_271224.HtM
BbS.okacop044.info/PoSt/1120_886088.HtM
BbS.okacop045.info/PoSt/1120_524821.HtM
BbS.okacop046.info/PoSt/1120_948494.HtM
BbS.okacop047.info/PoSt/1120_000555.HtM
BbS.okacop048.info/PoSt/1120_400901.HtM
BbS.okacop049.info/PoSt/1120_519349.HtM
BbS.okacop040.info/PoSt/1120_455414.HtM
BbS.okacop041.info/PoSt/1120_544962.HtM
BbS.okacop042.info/PoSt/1120_892671.HtM
BbS.okacop043.info/PoSt/1120_933516.HtM
BbS.okacop044.info/PoSt/1120_663580.HtM
BbS.okacop045.info/PoSt/1120_128785.HtM
BbS.okacop046.info/PoSt/1120_483752.HtM
BbS.okacop047.info/PoSt/1120_497227.HtM
BbS.okacop048.info/PoSt/1120_508692.HtM
BbS.okacop049.info/PoSt/1120_083819.HtM
BbS.okacop040.info/PoSt/1120_124961.HtM
BbS.okacop041.info/PoSt/1120_360106.HtM
BbS.okacop042.info/PoSt/1120_323362.HtM
BbS.okacop043.info/PoSt/1120_036502.HtM
BbS.okacop044.info/PoSt/1120_722554.HtM
BbS.okacop045.info/PoSt/1120_552658.HtM
BbS.okacop046.info/PoSt/1120_755252.HtM
BbS.okacop047.info/PoSt/1120_418643.HtM
BbS.okacop048.info/PoSt/1120_130095.HtM
BbS.okacop049.info/PoSt/1120_262915.HtM
BbS.okacop040.info/PoSt/1120_306381.HtM
BbS.okacop041.info/PoSt/1120_597865.HtM
BbS.okacop042.info/PoSt/1120_347645.HtM
BbS.okacop043.info/PoSt/1120_795274.HtM
BbS.okacop044.info/PoSt/1120_771392.HtM
BbS.okacop045.info/PoSt/1120_406791.HtM
BbS.okacop046.info/PoSt/1120_135413.HtM
BbS.okacop047.info/PoSt/1120_941837.HtM
BbS.okacop048.info/PoSt/1120_825196.HtM
BbS.okacop049.info/PoSt/1120_010439.HtM
BbS.okacop050.info/PoSt/1120_862843.HtM
BbS.okacop051.info/PoSt/1120_679737.HtM
BbS.okacop052.info/PoSt/1120_572399.HtM
BbS.okacop053.info/PoSt/1120_850854.HtM
BbS.okacop054.info/PoSt/1120_120349.HtM
BbS.okacop055.info/PoSt/1120_095077.HtM
BbS.okacop056.info/PoSt/1120_590370.HtM
BbS.okacop057.info/PoSt/1120_121946.HtM
BbS.okacop058.info/PoSt/1120_152362.HtM
BbS.okacop059.info/PoSt/1120_925191.HtM

#牛客AI配图神器#

全部评论

相关推荐

刷牛客的单身狗很认真:全国可飞,支持007 上班时间,是吧?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务