2015-09-30 26 views
16

websocket nella primavera del Boot app - Ottenere 403 Forbiddenwebsocket nella primavera del Boot app - Ottenere 403 Forbidden

mi può connettersi al websocket dal client utilizzando sockjs/stompjs quando ho eseguito questo in Eclipse (nessun avvio di primavera).

Ma quando creo un jar di avvio Spring (gradlew build) per il codice websocket ed eseguo il java-jar websocket-code.jar ottengo un errore 403 che si collega al websocket.

Non ho autenticazione per le websockets. Ho un filtro CORS e penso che abbia tutte le intestazioni giuste in richiesta/risposta.

Qui di seguito è il mio 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' 
} 

Aggiornamento:

Aggiunto un filtro CORS con response.setHeader ("Access-Control-Allow-Origin", "http://localhost:8089");

In Firebug sul lato client

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 

Origine mi sto chiedendo da è nella lista Consenti origine. Ancora ricevendo il messaggio di richiesta respinta nei log.

risposta

2

La differenza tra il mio ambiente 2 era la versione di vasi.

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

causa della dipendenza molla-boot-starter-websocket mentre confezionamento stesse raccogliendo molla websocket-4.1.7.RELEASE nonostante lo spring_version essere spring_version = 4.0.6.RELEASE.

Modificata la dipendenza in build.gradle che ha risolto il problema.

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

penso che in ultima versione di vaso primavera-websocket lo StompWebSocketEndpointRegistration classe ha metodo setAllowedOrigins che deve essere used.Have non provato questo.

Ma CORS filtro con

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

sta lavorando con una versione precedente.

+0

Non sono sicuro se questi funzionano ancora. Per me è come dire che il livello socket Web richiede credenziali per essere vero e anche quando ho messo il mio set le mie origini di permesso nel CORS. Ho ancora un 403 proibito – numerical25

47

Avevo un problema simile e l'ho risolto in WebSocketConfig impostando le origini consentite su "*".

@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

Grazie per la risposta. Penso che setAllowedOrigins sia stato aggiunto a StompWebSocketEndpointRegistration nella nuova versione. Penso che la tua soluzione dovrebbe funzionare nella nuova versione. Sto usando come vecchio websocket jar. – user3755282

+0

Ha funzionato come una magia – nurgasemetey

+4

non è insicuro usare un tale jolly per permessoOrigins? – niilzon

1

tenta di aggiungere

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

"your-end-point" viene registrato da @SendTo controller Credo