问题描述
我有一个通过SockJS使用Websockets的Spring boot 1.5 + Angular5应用程序,最近被迫升级到Spring boot 2.2。
升级后,我的websocket在一段随机的时间后或写入websocket时被关闭。使用Spring Boot 1.5时,一切正常。
以下是Spring中的配置,使用spring-boot-starter-websocket版本:“ 2.2.4.RELEASE”
@Configuration
@EnableWebSocketMessagebroker
public class WebSocketConfiguration extends AbstractWebSocketMessagebrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/api/socket")
.setAllowedOrigins("*")
.withSockJS();
}
@Override
public void configureMessagebroker(MessagebrokerRegistry registry) {
registry.setApplicationDestinationPrefixes("/app")
.enableSimplebroker("/nightly");
}
}
我还添加了以下安全规则:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.antMatcher("/api/socket/**")
.cors().and()
.headers().frameOptions().disable().and()
.csrf().disable()
.authorizeRequests()
.anyRequest().permitAll();
}
客户代码:
initWebSocket() {
const ws = new SockJS('/api/socket');
this.stompClient = Stomp.over(ws);
const that = this;
this.stompClient.connect({},() => {
that.stompClient.subscribe('/nightly',(message) => {
this._rootStore.dispatch(new UpdateNightlyAction(message));
});
});
}
当连接断开时,客户端记录以下内容:
POST https://<url>/api/socket/231/i0rsgjlx/xhr?t=1600673163228 404
Whoops! Lost connection to https://<url>/api/socket
我经历了Websockets的不同场景,这些场景在Spring Boot 2中不起作用,似乎没有任何帮助。在1.5中,它可以正常工作。我在这里想念什么?
解决方法
因为 springboot2.0^ is not allowed cors param allowedOrigins = "*" ,你可以覆盖 AllowedOriginPatterns equals "*"
boot1.5 ->
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
StompWebSocketEndpointRegistration registration = registry.addEndpoint("/webSocket");
registration.setAllowedOrigins("*");
registration.withSockJS();
}
boot2.0^->
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
StompWebSocketEndpointRegistration registration = registry.addEndpoint("/webSocket");
// boot2.0^ AllowedOrigins = * is not allown
registration.setAllowedOriginPatterns("*");
registration.withSockJS();
}
我和你的错误一样,找了半天也没找到 答案,所以我检查调试日志发现了这个问题,我用这个方法修复了它,它有效!