2015-09-30 119 views
16

的WebSocket在春季啓動應用程序 - 獲取403禁止的WebSocket在春季啓動應用程序 - 獲取403禁止

我可以從客戶端使用sockjs/stompjs連接的WebSocket,當我在Eclipse中運行這個(無彈簧引導)。

但是,當我爲websocket代碼創建一個Spring引導jar(gradlew構建)並運行java -jar websocket-code.jar時,出現連接到websocket的403錯誤。

我沒有認證的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' 
} 

更新:

增加了CORS濾波器 response.setHeader( 「訪問控制允許來源」, 「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 

地我從請求是在允許來源列表。在日誌中仍然收到拒絕請求消息。

回答

2

我的2環境之間的區別是罐子的版本。

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

因爲當包裝它被拿起spring_version是spring_version = 4.0.6.RELEASE的彈簧的WebSocket-4.1.7.RELEASE inspite彈簧引導起動的WebSocket依賴。

修改了修復問題的build.gradle中的依賴關係。

compile "org.springframework.boot:spring-boot-starter-websocket:1.1.0.RELEASE" 

我想在春天的WebSocket JAR的最新版本的類StompWebSocketEndpointRegistration有必須要used.Have沒有嘗試過這種方法setAllowedOrigins。

但CORS濾波器

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

正在與舊版本。

+0

不知道這些是否仍然有效。對我來說,它說網絡套接字層需要證書是真實的,甚至當我把我的允許起源在CORS。我仍然得到403禁止 – numerical25

47

我有一個類似的問題,並通過將允許的起源設置爲「*」來修復它在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 
} 
+1

感謝您的回答。我認爲setAllowedOrigins已經添加到新版本的StompWebSocketEndpointRegistration中。我認爲你的解決方案應該在新版本中工作。我正在使用較老的websocket jar。 – user3755282

+0

像魔術一樣工作 – nurgasemetey

+4

對allowedOrigins使用這樣的通配符不是不安全嗎? – niilzon

1

嘗試添加

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

「你 - 終點」由@SendTo在控制器中註冊我猜

相關問題