前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringMvc跨域配置和WebSocket跨域配置冲突问题记录

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

原创
作者头像
bug专8
修改2021-09-28 14:29:03
2.9K1
修改2021-09-28 14:29:03
举报
文章被收录于专栏:Java菜鸡冲冲冲!

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);
    }
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、问题描述
  • 2、跨域配置详情
    • WebSocket跨域配置
      • SpringMvc全局跨域配置
      • 3、解决方案
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档