programing

Spring Boot 앱의 웹 소켓 - 403 금지

newsource 2023. 3. 1. 11:13

Spring Boot 앱의 웹 소켓 - 403 금지

Spring Boot 앱의 웹 소켓 - 403 금지

이클립스(스프링 부트 없음)에서 실행할 때 클라이언트에서 sockjs/stompjs를 사용하여 웹 소켓에 연결할 수 있습니다.

그러나 웹 소켓코드용 Spring boot jar(gradw build)를 생성하여 java -jar websocket-code.jar를 실행하면 웹 소켓에 접속할 때 403 오류가 발생합니다.

웹소켓에 대한 인증이 없습니다.저는 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 필터 추가.setHeader("액세스 제어 허용 오리진", "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 목록에 있습니다.로그에 Request Rejected 메시지가 아직 표시됩니다.

같은 문제가 발생하여 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
}

추가하려고 하다

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

컨트롤러의 @SendTo에 의해 "당신의 엔드 포인트"가 등록됩니다.

나의 두 환경의 차이점은 항아리 버전이었다.

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

패키징 중 스프링 부트 스타터 웹 소켓 의존성 때문에 스프링 웹 소켓-4.1.7을 사용하고 있었습니다.spring_version=4.0.6인 spring_version의 inspite를 해제합니다.풀어주다.

문제를 수정하는 build.gradle 의존관계를 수정.

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

spring-websocket jar의 최신 버전에서는 StompWebSocketEndpointRegistration 클래스가 사용해야 하는 AllowedOrigins 메서드를 설정했다고 생각합니다.이거 먹어본 적 없어.

하지만 CORS 필터는

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

이전 버전으로 동작하고 있습니다.

참고로 스프링의 새로운 버전에는 다른 방법이 필요합니다.

registry.addEndpoint("/websocket-connection").setAllowedOriginPatterns("*").withSockJS();

언급URL : https://stackoverflow.com/questions/32874421/websocket-in-spring-boot-app-getting-403-forbidden