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リストにあります。まだログにリクエスト拒否メッセージが表示されます。
私の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");
古いバージョンで動作しています。
同様の問題があり、許可された起点を「*」に設定することで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
}
追加してみてください
registry.addEndpoint("/your-end-point").setAllowedOrigins("*").withSockJS();
「your-end-point」は、コントローラの@SendToによって登録されていると思います