web-dev-qa-db-ja.com

Spring BootアプリのWebsocket-403 Forbiddenの取得

Spring BootアプリのWebsocket-403 Forbiddenの取得

Eclipseでこれを実行するとき(スプリングブートなし)、sockjs/stompjsを使用してクライアントからwebsocketに接続できます。

しかし、websocketコード用にSpringブートjar(gradlew build)を作成し、Java -jar websocket-code.jarを実行すると、websocketへの接続時に403エラーが発生します。

WebSocketの認証がありません。 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'
}

更新:

Response.setHeader( "Access-Control-Allow-Origin"、 " http:// localhost:8089 ");を使用してCORSフィルターを追加しました。

クライアント側のファイアバグで

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

私がリクエストしているオリジンは、Allow-Originリストにあります。まだログにリクエスト拒否メッセージが表示されます。

20
user3755282

私の2つの環境の違いは、jarのバージョンでした。

spring-boot-starter-websocket-1.2.5.RELEASE.jar
spring-websocket-4.1.7.RELEASE.jar

パッケージング中のspring-boot-starter-websocket依存関係のため、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"

Spring-websocket jarの最新バージョンでは、クラスStompWebSocketEndpointRegistrationにsetAllowedOriginsメソッドが使用されている必要があると思います。これを試してはいけません。

しかし、CORSフィルターは

response.setHeader("Access-Control-Allow-Origin", "http://localhost:8089");

古いバージョンで動作しています。

3
user3755282

同様の問題があり、許可された起点を「*」に設定することで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
}
71
Dustin Shimono

追加してみてください

registry.addEndpoint("/your-end-point").setAllowedOrigins("*").withSockJS();

「your-end-point」は、コントローラの@SendToによって登録されていると思います

1
Long Do Thanh