java—如何在Spring5.3及更新版本中使用stomp和sockjs处理cors起源?

6jjcrrmo  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(1110)

我正在开发一个同时使用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 标题已分配。。。
我该怎么解决这个问题?

v9tzhpje

v9tzhpje1#

从文档中
配置允许的源标题值。此检查主要是为浏览器客户端设计的。没有什么可以阻止其他类型的客户机修改源标题值。当sockjs被启用并且源被限制时,不允许检查请求源的传输类型(基于iframe的传输)被禁用。因此,当来源受到限制时,ie 6到9不受支持。每个提供的允许源必须以“http://”、“https://”或“*”开头(表示允许所有源)。默认情况下,只允许相同的原始请求(空列表)。由于:4.1.2另请参见:rfc6454:weborigin概念,sockjs支持浏览器传输
你的代码

registry.addEndpoint("/socketendpoint").setAllowedOrigins("*").setAllowedOrigins().withSockJS();

应该是

registry.addEndpoint("/socketendpoint").setAllowedOrigins("*").withSockJS();

相关问题