我正在开发一个同时使用rest端点和sockjswebsocket的服务器应用程序。在Spring5.2及以下的版本中,它可以正常工作。
但是,从5.3版本开始,以下方法就存在于 org.springframework.web.cors.CorsConfiguration
:
public void validateAllowCredentials() {
if (this.allowCredentials == Boolean.TRUE &&
this.allowedOrigins != null && this.allowedOrigins.contains(ALL)) {
throw new IllegalArgumentException(
"When allowCredentials is true, allowedOrigins cannot contain the special value \"*\"" +
"since that cannot be set on the \"Access-Control-Allow-Origin\" response header. " +
"To allow credentials to a set of origins, list them explicitly " +
"or consider using \"allowedOriginPatterns\" instead.");
}
}
到目前为止,我的套接字配置如下:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfiguration implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
// prefix for the client to send messages to the server
config.setApplicationDestinationPrefixes("/app");
// prefix for the client to receive broadcasted messages from the server
config.enableSimpleBroker("/topic");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
// defines the url of the socket so the client can connect to it
registry.addEndpoint("/socketendpoint").setAllowedOrigins("*").setAllowedOrigins().withSockJS();
}
}
现在我面临一个真正的问题:
如果我保持 setAllowedOrigins("*")
在 WebSocketConfiguration
,那么我将面对抛出的错误 validateAllowCredentials
.
如果我移除 setAllowedOrigins("*")
,则sockjs客户端将收到 Error during WebSocket handshake: Unexpected response code: 403
.
我不知道编译时的源域。
我已经尝试过cors过滤器和cors配置,它们使用典型的“返回 origin
您在请求中找到的标题为 allow-origin
“通常用来绕过 allow-origin: "*"
,但有些sockjs请求没有 origin
标题已分配。。。
我该怎么解决这个问题?
1条答案
按热度按时间v9tzhpje1#
从文档中
配置允许的源标题值。此检查主要是为浏览器客户端设计的。没有什么可以阻止其他类型的客户机修改源标题值。当sockjs被启用并且源被限制时,不允许检查请求源的传输类型(基于iframe的传输)被禁用。因此,当来源受到限制时,ie 6到9不受支持。每个提供的允许源必须以“http://”、“https://”或“*”开头(表示允许所有源)。默认情况下,只允许相同的原始请求(空列表)。由于:4.1.2另请参见:rfc6454:weborigin概念,sockjs支持浏览器传输
你的代码
应该是