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