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)
部署注意事项
- Nginx需配置WebSocket代理:
location /ws/ {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
- 生产环境建议添加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

