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.
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.
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
}
essayez d'ajouter
registry.addEndpoint("/your-end-point").setAllowedOrigins("*").withSockJS();
"your-end-point" est enregistré par @SendTo dans le contrôleur, je suppose