我正在使用服务器端的Spring Web socket + stomp + SockJsClient和角度端的SockJS将消息从服务器端发送到角度客户端应用程序。
我的Socket服务器是一个Spring Boot应用程序,运行在8080端口上。
它可以通过ws / http协议正常工作。但是现在我已经在套接字服务器上启用了SSL。
套接字服务器配置。
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic");
config.setApplicationDestinationPrefixes("/topic");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/sync").setAllowedOrigins("*").withSockJS();
}}
通过WS的Java客户端的工作代码
List<Transport> transports = new ArrayList<Transport>(1);
transports.add(new RestTemplateXhrTransport());
SockJsClient sockJsClient = new SockJsClient(transports);
sockJsClient.setMessageCodec(new Jackson2SockJsMessageCodec());
WebSocketStompClient stompClient = new WebSocketStompClient(sockJsClient);
stompClient.setMessageConverter(new StringMessageConverter());
String url = "ws://my-socket.server.com/sync";
StompSessionHandler sessionHandler = new MyStompSessionHandler(senderId, syncUrl, content);
stompClient.connect(url, sessionHandler);
通过HTTP的角度客户端的工作代码
const Stomp = StompJs.Stomp;
const socket = new SockJS('http://my-socket.server.com/sync');
this.stompClient = Stomp.over(socket);
this.stompClient.connect({}, (res, err) => {}
现在,我已经在运行在单独的Spring Boot服务器上的Web套接字服务器上实现了SSL。并在服务器和客户端更新协议。 ws到wss,http到https。
还要尝试以下操作来添加SSL上下文
StandardWebSocketClient simpleWebSocketClient = new StandardWebSocketClient();
List<Transport> transports = new ArrayList<Transport>(1);
Map<String, Object> userProperties = new HashMap<String, Object>();
userProperties.put("org.apache.tomcat.websocket.SSL_CONTEXT", SSLContext.getDefault());
simpleWebSocketClient.setUserProperties(userProperties);
transports.add(new WebSocketTransport(simpleWebSocketClient));
我从以下堆栈链接中获取了参考,但没有运气:(
Secure websocket with HTTPS (SSL)
How to use Spring WebSocketClient with SSL?
请帮助我摆脱困境。
谢谢:)
答案 0 :(得分:0)
我们通过同样的问题,先把withSockJS之类的去掉
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfigurer implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/");
config.setApplicationDestinationPrefixes("/js");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/").setAllowedOrigins("*");
}
}
我们的前端是在 VUE 中,但在 JS 中的连接仍然相同。
WEB_SOCKET_URL_PREFIX: 'ws://localhost:8080/'
connect(resolve) {
const URL = '/somePath';
this.webSocket = new WebSocket(HttpConfig.WEB_SOCKET_URL_PREFIX);
this.stompClient = Stomp.over(this.webSocket, { debug: false });
this.stompClient.connect({}, () => {
this.stompClient.subscribe(URL, data => {
console.log(data);
});
});
}
在你的java代码中你可以发送修改
private final SimpMessagingTemplate simpMessagingTemplate;
public void someMethod(){
...
simpMessagingTemplate.convertAndSend("/somePath", "someContent");
...
}