SpringMvc跨域配置和WebSocket跨域配置冲突问题记录

2021-09-28 14:29:03 浏览数 (1)

1、问题描述

WebSocket配置跨域后,WebSocket跨域生效。而当SpringMvc配置全局跨域后,全局controller请求跨域生效,但是WebSocket跨域配置失效。

2、跨域配置详情

WebSocket跨域配置

代码语言:java复制
// 设置允许跨域请求的域名
.setAllowedOriginPatterns("*")
代码语言:java复制
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    /**
     * 这个方法的作用是添加一个服务端点,来接收客户端的连接。
     * registry.addEndpoint("/socket")表示添加了一个/socket端点,客户端就可以通过这个端点来进行连接。
     * withSockJS()的作用是开启SockJS支持。
     * @param registry
     */
    @Override
    // 注册STOMP协议的节点(endpoint),并映射指定的url
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        // 注册一个STOMP的endpoint,并指定使用SockJS协议
        registry.addEndpoint("/socket")
                // 设置允许跨域请求的域名
                .setAllowedOriginPatterns("*")
                .withSockJS();
    }

    @Override
    // 配置消息代理(Message Broker)
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        /**
         * 表示客户端订阅地址的前缀信息,也就是客户端接收服务端消息的地址的前缀信息
         * 广播式应配置一个/topic消息代理
         * 点对点应配置一个/user消息代理
         */
        registry.enableSimpleBroker("/topic","/user");
        // 点对点使用的订阅前缀(客户端订阅路径上会体现出来),不设置的话,默认也是/user/
        registry.setUserDestinationPrefix("/user");
        // 指服务端接收地址的前缀,意思就是说客户端给服务端发消息的地址的前缀
//        registry.setApplicationDestinationPrefixes("/socket");
    }
}

SpringMvc全局跨域配置

代码语言:java复制
@Configuration
public class WebAppConfig implements WebMvcConfigurer {

    /**
     * 跨域配置
     * @param registry
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("PUT", "DELETE", "GET", "POST", "OPTIONS")
                .allowedHeaders("*")
                .exposedHeaders("access-control-allow-headers",
                        "access-control-allow-methods",
                        "access-control-allow-origin",
                        "access-control-max-age",
                        "X-Frame-Options")
                .allowCredentials(true)
                .maxAge(3600);
    }
}

3、解决方案

修改SpringMvc全局跨域配置,取消设置allowCredentials(true),使其默认false

代码语言:javascript复制
@Configuration
public class WebAppConfig implements WebMvcConfigurer {

    @Autowired
    ResponseResultInterceptor responseResultInterceptor;

    /**
     * 跨域配置
     * @param registry
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("PUT", "DELETE", "GET", "POST", "OPTIONS")
                .allowedHeaders("*")
                .exposedHeaders("access-control-allow-headers",
                        "access-control-allow-methods",
                        "access-control-allow-origin",
                        "access-control-max-age",
                        "X-Frame-Options")
                // 启用后会导致websocket跨域配置失效
                // .allowCredentials(true)
                .maxAge(3600);
    }
}

0 人点赞