后端使用 SpringBoot 集成的 WebSocket 服务
Java 代码如下:
配置 WebSocket
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry) {
stompEndpointRegistry.addEndpoint("/endpointSang").withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/topic");
}
}
WebSocket 控制器
@Controller
public class WsController {
@MessageMapping("/welcome")
@SendTo("/topic/getResponse")
public ResponseMessage say(RequestMessage message) {
System.out.println(message.getName());
return new ResponseMessage("welcome," + message.getName() + " !");
}
}
现在前端进行连接时会抛出异常
var ctx = 'ws://localhost:8080'
// 创建一个 Scoket 端点连接
var socket = new SockJS(`${ctx}/endpointSang`)
var stompClient = Stomp.over(socket)
// 链接到端点
stompClient.connect({}, frame => {
console.log('连接到:', frame)
stompClient.subscribe(`${ctx}/topic/getResponse`, response => {
console.log('订阅的主题发送了消息:', JSON.parse(response.body).responseMessage)
})
})
// 通过端点客户端发送一个消息到服务器
stompClient.send(`${ctx}/welcome`, {}, JSON.stringify({ name: 'rx' }))
// 抛出的异常
main.js:73 Uncaught SyntaxError: The URL's scheme must be either 'http:' or 'https:'. 'ws:' is not allowed.
at new SockJS (main.js:73)
at simple-websocket.html:17
但如果是在后端项目下的话就可以使用下面的代码进行调用
// 这里是空的,不需要指定前缀
var ctx = ''
// 创建一个 Scoket 端点连接
var socket = new SockJS(`${ctx}/endpointSang`)
var stompClient = Stomp.over(socket)
// 链接到端点
stompClient.connect({}, frame => {
console.log('连接到:', frame)
stompClient.subscribe(`${ctx}/topic/getResponse`, response => {
console.log('订阅的主题发送了消息:', JSON.parse(response.body).responseMessage)
})
})
// 通过端点客户端发送一个消息到服务器
stompClient.send(`${ctx}/welcome`, {}, JSON.stringify({ name: 'rx' }))
所以,发生了什么?吾辈应该怎么做呢?
最近写过类似的,自定义配置拦截器和广播消息前缀
然后业务层使用消息模板,其他照常