Spring Boot应用程序中的Websocket - 获取403禁止

use*_*282 20 java gradle websocket sockjs spring-boot

Spring Boot应用程序中的Websocket - 获取403禁止

当我在eclipse(没有弹簧启动)中运行时,我可以使用sockjs/stompjs从客户端连接到websocket.

但是当我为websocket代码创建一个Spring启动jar(gradlew build)并运行java -jar websocket-code.jar时,我得到403错误连接到websocket.

我没有websockets的身份验证.我有一个CORS过滤器,并认为请求/响应中的所有标题正确.

下面是我的build.gradle

apply plugin: 'java'
apply plugin: 'spring-boot'
apply plugin: 'war'

sourceCompatibility = 1.7
version = '1.0'

repositories {
    mavenCentral()
}

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.2.5.RELEASE")
    }
}

configurations {
    compile.exclude module: "spring-boot-starter-tomcat"
}

dependencies {
    compile "org.springframework:spring-web:$spring_version"
    compile "org.springframework:spring-webmvc:$spring_version"
    compile "org.springframework:spring-websocket:$spring_version"
    compile "org.springframework:spring-messaging:$spring_version"
    compile "org.springframework.boot:spring-boot-starter-websocket"
    compile "org.springframework.boot:spring-boot-starter-web"
    compile "com.fasterxml.jackson.core:jackson-databind:2.6.2"
    compile "com.fasterxml.jackson.core:jackson-core:2.6.2"
    compile "com.fasterxml.jackson.core:jackson-annotations:2.6.2"
    compile "org.springframework.amqp:spring-rabbit:1.3.5.RELEASE"
    compile("org.springframework:spring-tx")
    compile("org.springframework.boot:spring-boot-starter-web:1.2.6.RELEASE")
    compile("org.springframework.boot:spring-boot-starter-jetty:1.2.6.RELEASE")
    testCompile group: 'junit', name: 'junit', version: '4.11'
    testCompile "org.springframework:spring-test:$spring_version"
}

task wrapper(type: Wrapper) {
    gradleVersion = '2.5'
}
Run Code Online (Sandbox Code Playgroud)

更新:

添加了带有response.setHeader的CORS过滤器("Access-Control-Allow-Origin"," http:// localhost:8089 ");

在客户端的萤火虫

Request Headers 
Origin  
http://localhost:8089

Response Headers
Access-Control-Allow-Origin
http://localhost:8089

Server Logs
2015-10-02 16:57:31.372 DEBUG 1848 --- [qtp374030679-14] o.s.w.s.s.t.h.DefaultSockJsService       : Request rejected, Origin header value http://localhost:8089 not allowed
Run Code Online (Sandbox Code Playgroud)

我请求的来源是在允许来源列表中.仍在日志中收到Request Rejected消息.

Dus*_*ono 72

我有一个类似的问题,并通过将允许的起源设置为"*"将其修复在WebSocketConfig中.

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        // the endpoint for websocket connections
        registry.addEndpoint("/stomp").setAllowedOrigins("*").withSockJS();
    }

    // remaining config not shown as not relevant
}
Run Code Online (Sandbox Code Playgroud)

  • 对allowedOrigins使用这样的通配符是不是不安全? (5认同)
  • 请注意,这也适用于在“WebSocketConfigurer”中注册的原始 Web 套接字。在方法 `public void registerWebSocketHandlers(WebSocketHandlerRegistryregistry) {}` 中,您可以调用 `registry.addHandler(new MyWebSocketHandler(), "/some-path").setAllowedOrigins("*");`。不幸的是,WebSocket 无法告诉您这是一个 CORS 问题……403 非常具有误导性。 (4认同)
  • 谢谢你的回答.我认为setAllowedOrigins已添加到新版本的StompWebSocketEndpointRegistration中.我认为您的解决方案应该适用于新版本.我使用旧的websocket jar. (2认同)

Gal*_*ett 6

作为参考,较新版本的 spring 需要不同的方法:

registry.addEndpoint("/websocket-connection").setAllowedOriginPatterns("*").withSockJS();
Run Code Online (Sandbox Code Playgroud)


Lon*_*anh 5

尝试添加

registry.addEndpoint("/your-end-point").setAllowedOrigins("*").withSockJS();
Run Code Online (Sandbox Code Playgroud)

“你的终点”是由@SendTo 在控制器中注册的,我猜


use*_*282 4

我的两个环境之间的差异是罐子的版本。

spring-boot-starter-websocket-1.2.5.RELEASE.jar
spring-websocket-4.1.7.RELEASE.jar
Run Code Online (Sandbox Code Playgroud)

由于打包时的 spring-boot-starter-websocket 依赖关系,尽管 spring_version 为 spring_version=4.0.6.RELEASE,但它还是选择了 spring-websocket-4.1.7.RELEASE。

修改了 build.gradle 中的依赖项,解决了问题。

compile "org.springframework.boot:spring-boot-starter-websocket:1.1.0.RELEASE"
Run Code Online (Sandbox Code Playgroud)

我认为在最新版本的 spring-websocket jar 中,类 StompWebSocketEndpointRegistration 具有必须使用的 setAllowedOrigins 方法。还没有尝试过这个。

但是 CORS 过滤器

response.setHeader("Access-Control-Allow-Origin", "http://localhost:8089");
Run Code Online (Sandbox Code Playgroud)

正在使用旧版本。