SockJS and CORS

    如果你允许跨源请求(见允许的源头),SockJS 协议在 XHR 流和轮询传输中使用 CORS 进行跨域支持。因此,除非检测到响应中存在 CORS 头,否则会自动添加 CORS 头。因此,如果一个应用程序已经被配置为提供 CORS 支持(例如,通过 Servlet Filter),Spring 的 SockJsService 会跳过这一部分。

    也可以通过在 Spring 的 SockJsService 中设置 suppressCors 属性来禁止添加这些 CORS 头信息。

    SockJS 期望有以下头信息和值。

    • Access-Control-Allow-Origin:从 Origin 请求头的值中初始化。
    • Access-Control-Allow-Credentials:总是设置为 true。
    • Access-Control-Request-Headers:从等价请求头的值中初始化。
    • Access-Control-Allow-Methods。一个传输支持的 HTTP 方法(见 TransportType 枚举)。
    • Access-Control-Max-Age:设置为 31536000(1 年)。

    关于具体的实现,见 AbstractSockJsService 中的 addCorsHeaders 和源代码中的 TransportType 枚举。

    另外,如果 CORS 配置允许,可以考虑排除带有 SockJS 端点前缀的 URL,从而让 Spring 的 SockJsService 处理。