我正在使用服务器端的 Spring web socket + stomp + SockJsClient 和角度端的 SockJS 将消息从服务器端发送到角度客户端应用程序。
我的 Socket 服务器是一个 Spring Boot 应用程序,运行在 8080 端口上。
它在 ws/http 协议(protocol)上运行良好。但现在我已经在套接字服务器上启用了 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 上 Angular 客户端的工作代码
const Stomp = StompJs.Stomp;
const socket = new SockJS('http://my-socket.server.com/sync');
this.stompClient = Stomp.over(socket);
this.stompClient.connect({}, (res, err) => {}
现在我已经在我的 web 套接字服务器上实现了 SSL,该服务器在单独的 spring boot 服务器上运行。并在服务器和客户端更新协议(protocol),如。 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?
请帮我摆脱它。
谢谢 :)
最佳答案
我们遇到同样的问题,先去掉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");
...
}
关于spring-boot - Spring websocket (WSS) 与 angular sockjs (HTTPS) 在安全 web socket 服务器 (tomcat) 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56662596/