Spring 启动应用程序中的 Websocket - 获取 403 禁止
Websocket in Spring Boot app - Getting 403 Forbidden
Spring 启动应用程序中的 Websocket - 获取 403 禁止
当我在 eclipse 中 运行 时(没有 spring 引导),我可以使用 sockjs/stompjs 从客户端连接到 websocket。
但是当我为 websocket 代码创建 Spring 引导 jar(gradlew 构建)和 运行 java -jar websocket-code.jar 我得到一个 403连接到 websocket 时出错。
我没有对 websockets 进行身份验证。
我有一个 CORS 过滤器,我认为所有 headers 都在 request/response.
中
下面是我的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("Access-Control-Allow-Origin", "http://localhost:8089");
在客户端firebug
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 列表中。仍然在日志中收到请求被拒绝的消息。
我遇到了类似的问题,并通过将允许的来源设置为“*”在 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
}
我的 2 环境的区别是 jars 的版本。
spring-boot-starter-websocket-1.2.5.RELEASE.jar
spring-websocket-4.1.7.RELEASE.jar
由于 spring-boot-starter-websocket 依赖,打包时它正在获取 spring-websocket-4.1.7.RELEASE 尽管 spring_version spring_version=4.0.6.RELEASE.
修改了 build.gradle 中的依赖项,解决了问题。
compile "org.springframework.boot:spring-boot-starter-websocket:1.1.0.RELEASE"
我认为在最新版本的 spring-websocket jar 中 class StompWebSocketEndpointRegistration 有 setAllowedOrigins 方法,必须 used.Have 没试过这个。
但是 CORS 过滤器
response.setHeader("Access-Control-Allow-Origin", "http://localhost:8089");
正在使用旧版本。
尝试添加
registry.addEndpoint("/your-end-point").setAllowedOrigins("*").withSockJS();
我猜 "your-end-point" 是由 @SendTo 在控制器中注册的
作为参考,较新版本的 spring 需要不同的方法:
registry.addEndpoint("/websocket-connection").setAllowedOriginPatterns("*").withSockJS();
Spring 启动应用程序中的 Websocket - 获取 403 禁止
当我在 eclipse 中 运行 时(没有 spring 引导),我可以使用 sockjs/stompjs 从客户端连接到 websocket。
但是当我为 websocket 代码创建 Spring 引导 jar(gradlew 构建)和 运行 java -jar websocket-code.jar 我得到一个 403连接到 websocket 时出错。
我没有对 websockets 进行身份验证。 我有一个 CORS 过滤器,我认为所有 headers 都在 request/response.
中下面是我的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("Access-Control-Allow-Origin", "http://localhost:8089");
在客户端firebug
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 列表中。仍然在日志中收到请求被拒绝的消息。
我遇到了类似的问题,并通过将允许的来源设置为“*”在 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
}
我的 2 环境的区别是 jars 的版本。
spring-boot-starter-websocket-1.2.5.RELEASE.jar
spring-websocket-4.1.7.RELEASE.jar
由于 spring-boot-starter-websocket 依赖,打包时它正在获取 spring-websocket-4.1.7.RELEASE 尽管 spring_version spring_version=4.0.6.RELEASE.
修改了 build.gradle 中的依赖项,解决了问题。
compile "org.springframework.boot:spring-boot-starter-websocket:1.1.0.RELEASE"
我认为在最新版本的 spring-websocket jar 中 class StompWebSocketEndpointRegistration 有 setAllowedOrigins 方法,必须 used.Have 没试过这个。
但是 CORS 过滤器
response.setHeader("Access-Control-Allow-Origin", "http://localhost:8089");
正在使用旧版本。
尝试添加
registry.addEndpoint("/your-end-point").setAllowedOrigins("*").withSockJS();
我猜 "your-end-point" 是由 @SendTo 在控制器中注册的
作为参考,较新版本的 spring 需要不同的方法:
registry.addEndpoint("/websocket-connection").setAllowedOriginPatterns("*").withSockJS();