以下是在开发中遇见的问题:为什么 WebSocket 连接成功了之后,无法收到服务端发来的默认客服消息。也设置了header请求头,服务端也能解析出UserId并设置到 accessor.setUser(new StompPrincipal(userId)); 在 WebSocketConnectListener 连接监听方法里面也能打印出用户也登录和用户ID,但未正常推送消息到客户端的
```javascript
this.stompClient.subscribe('/user/queue/messages', msg => {
if (msg.body) {
const message = JSON.parse(msg.body);
this.messages.push(message);
}
});
的这个方法里,无法再页面上显示默认消息
```java
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws/chat")
.setAllowedOriginPatterns("http://172.16.32.4:8082", "http://172.16.32.4:8080")
.withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/topic", "/queue");
registry.setApplicationDestinationPrefixes("/app");
}
@Override
public void configureClientInboundChannel(ChannelRegistration registration) {
registration.interceptors(new ChannelInterceptor() {
@Override
public Message<?> preSend(Message<?> message, MessageChannel channel) {
StompHeaderAccessor accessor = StompHeaderAccessor.wrap(message);
if (StompCommand.CONNECT.equals(accessor.getCommand())) {
try {
String Authorization = accessor.getFirstNativeHeader("Authorization");
if (Authorization == null || Authorization.isEmpty()) {
throw new MessageDeliveryException("会话已超时,请先登录再继续咨询。");
}
String userId = AuthToUserIdUtils.getUserIdFromStomp(Authorization);
accessor.setUser(new StompPrincipal(userId));
return MessageBuilder.createMessage(message.getPayload(), accessor.getMessageHeaders());
} catch (Exception e) {
throw new MessageDeliveryException("会话已超时,请先登录再继续咨询。");
}
}
return message;
}
});
}
}
```java
@Component
public class WebSocketConnectListener implements ApplicationListener<SessionConnectedEvent> {
@Autowired
private SimpMessagingTemplate messagingTemplate;
@Autowired
private ChatSessionService chatSessionService;
@Autowired
private ChatMessageService chatMessageService;
@Override
public void onApplicationEvent(SessionConnectedEvent event) {
StompHeaderAccessor accessor = StompHeaderAccessor.wrap(event.getMessage());
Principal userPrincipal = accessor.getUser();
if (userPrincipal != null) {
System.out.println("用户已登录");
System.out.println("用户ID:" + userPrincipal.getName());
String userId = userPrincipal.getName();
// 1. 检查是否已有会话
ChatSession session = chatSessionService.getOrCreateSessionForUser(userId);
// 2. 构造系统欢迎消息
ChatMessage welcomeMsg = new ChatMessage();
welcomeMsg.setSessionId(session.getId());
welcomeMsg.setSenderRole("system");
welcomeMsg.setSenderId(Integer.valueOf(userId));
welcomeMsg.setMessageType("system");
welcomeMsg.setContent("您好,欢迎来到客服中心,我们会尽快为您服务!");
welcomeMsg.setCreatedAt(LocalDateTime.now());
// 3. 存入数据库
// chatMessageService.save(welcomeMsg);
// 4. 发送消息给用户
HashMap<String, Object> message = new HashMap<>();
message.put("text", "您好,欢迎来到客服中心,我们会尽快为您服务!");
message.put("isUser", false);
message.put("avatar", "http://localhost:8081/upload/cbdbbfe6c2d9408f8242c10a674affea1753843824516.jpg");
message.put("time", LocalDateTime.now());
new Timer().schedule(new TimerTask() {
@Override
public void run(){
messagingTemplate.convertAndSendToUser(userId, "/queue/messages", message);
}
},1500);
}else {
System.out.println("用户未登录");
}
}
}
connect() {
this.stompClient = new Client({
webSocketFactory: () => new SockJS('http://172.16.32.4:8081/ws/chat'),
reconnectDelay: 5000,
connectHeaders: { 'Authorization': 'Bearer ' + localStorage.getItem("token")},
onConnect: () => {
this.hasErrorShown = false;
this.stompClient.subscribe('/user/queue/messages', msg => {
if (msg.body) {
const message = JSON.parse(msg.body);
this.messages.push(message);
}
});
},
onStompError: (frame) => {
if (!this.hasErrorShown) {
const errorMsg = frame.headers['message'];
this.$message.error(errorMsg);
this.hasErrorShown = true;
}
}
});
this.stompClient.activate();
},
```