web-dev-qa-db-fra.com

Websocket dans l'application Spring Boot - Obtention de l'interdiction 403

Websocket dans l'application Spring Boot - Obtention de l'interdiction 403

Je peux me connecter au websocket à partir du client en utilisant sockjs/stompjs lorsque je l'exécute dans Eclipse (pas de démarrage à ressort).

Mais lorsque je crée un fichier de démarrage Spring (version gradlew) pour le code websocket et que j'exécute le Java -jar websocket-code.jar, j'obtiens une erreur 403 lors de la connexion au websocket.

Je n'ai aucune authentification pour les websockets. J'ai un filtre CORS et je pense avoir tous les en-têtes directement dans la demande/réponse.

Ci-dessous est mon 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'
}

Mise à jour:

Ajout d'un filtre CORS avec response.setHeader ("Access-Control-Allow-Origin", " http: // localhost: 8089 ");

Dans Firebug côté 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

L'origine que je demande est dans la liste Allow-Origin. Obtention du message Request Rejected dans les journaux.

20
user3755282

La différence entre mon 2 environnement était la version des pots.

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

En raison de la dépendance de Spring-boot-starter-websocket lors de l'empaquetage, il récupérait spring-websocket-4.1.7.RELEASE malgré la version spring_version étant spring_version = 4.0.6.RELEASE.

Modification de la dépendance dans build.gradle qui a résolu le problème.

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

Je pense que dans la dernière version du pot spring-websocket, la classe StompWebSocketEndpointRegistration a la méthode setAllowedOrigins qui doit être utilisée. Je n'ai pas essayé cela.

Mais le filtre CORS avec

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

fonctionne avec une version plus ancienne.

3
user3755282

J'ai eu un problème similaire et l'ai résolu dans WebSocketConfig en définissant les origines autorisées sur "*".

@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

essayez d'ajouter

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

"your-end-point" est enregistré par @SendTo dans le contrôleur, je suppose

1
Long Do Thanh