복붙노트

[SPRING] Spring Boot에서 HTTP OPTIONS 요청을 처리하는 방법은 무엇입니까?

SPRING

Spring Boot에서 HTTP OPTIONS 요청을 처리하는 방법은 무엇입니까?

우선, "Spring MVC로 HTTP 옵션을 처리하는 방법"을 읽었습니다. 대답은 Spring Boot에 직접적으로 적용되는 것처럼 보이지 않습니다.

내가 이렇게 해야하는 것 같습니다.

하지만 XML 설정이 없거나,이 답변에서 언급 한 코드에서 DispatcherServlet 이니셜 라이저 클래스를 다양하게 사용하면 어떻게 할 수 있습니까?

@RestController 클래스에서, 나는 현재 호출되지 않는 이와 같은 메소드를 가지고있다.

@RequestMapping(value = "/foo", method = RequestMethod.OPTIONS)
public ResponseEntity options(HttpServletResponse response) {
    log.info("OPTIONS /foo called");
    response.setHeader("Allow", "HEAD,GET,PUT,OPTIONS");
    return new ResponseEntity(HttpStatus.OK);
}

봄 부팅 1.2.7. 릴리스; 스프링 REST 가이드의 설정과 크게 다르지 않은 간단한 설정.

해결법

  1. ==============================

    1.Spring 1.3.0부터는 다음과 같은 속성을 사용하여이 동작을 설정할 수 있습니다 :

    Spring 1.3.0부터는 다음과 같은 속성을 사용하여이 동작을 설정할 수 있습니다 :

    spring.mvc.dispatch-options-request=true
    

    Spring Boot의 DispatcherServlet은 DispatcherServletAutoConfiguration에 의해 정의됩니다. 자동 구성에서 사용되는 DispatcherServlet Bean을 구성 클래스의 어딘가에 만들 수 있습니다.

    @Bean(name = DispatcherServletAutoConfiguration.DEFAULT_DISPATCHER_SERVLET_BEAN_NAME)
    public DispatcherServlet dispatcherServlet() {
        DispatcherServlet dispatcherServlet = new DispatcherServlet();
        dispatcherServlet.setDispatchOptionsRequest(true);
        return dispatcherServlet;
    }
    

    그러나 DispatcherServlet 빈을 정의하면 자동 구성이 비활성화되므로 자동 구성 클래스에 선언 된 다른 Bean, 즉 DispatcherServlet에 대한 ServletRegistrationBean을 수동으로 정의해야합니다.

    Bean이 초기화되기 전에 dispatchOptionsRequest 속성을 true로 설정하는 BeanPostProcessor 구현을 작성할 수 있습니다. Yoy는 구성 클래스의 어딘가에 다음과 같이 넣을 수 있습니다.

    @Bean
    public DispatcherServletBeanPostProcessor dispatcherServletBeanPostProcessor() {
        return new DispatcherServletBeanPostProcessor();
    }
    
    public static class DispatcherServletBeanPostProcessor implements BeanPostProcessor {
        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            if (bean instanceof DispatcherServlet) {
                ((DispatcherServlet) bean).setDispatchOptionsRequest(true);
            }
            return bean;
        }
    
        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            return bean;
        }
    }
    

    애플리케이션에 SpringBootServletInitializer가 있으면 다음과 같이 OPTIONS 디스패치를 ​​활성화 할 수 있습니다.

    public class ServletInitializer extends SpringBootServletInitializer {
        @Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
            return application.sources(Application.class);
        }
    
        @Override
        public void onStartup(ServletContext servletContext) throws ServletException {
            super.onStartup(servletContext);
            servletContext.getServletRegistration(DispatcherServletAutoConfiguration.DEFAULT_DISPATCHER_SERVLET_BEAN_NAME)
                    .setInitParameter("dispatchOptionsRequest", "true");
        }
    }
    

    그러나 Spring 부트 응용 프로그램을 main 메소드를 사용하여 실행할 때 SpringBootServletInitializer 코드가 실행되지 않으므로 응용 프로그램을 WAR로서 Servlet 컨테이너에 배포 한 경우에만 작동합니다.

  2. ==============================

    2.나는 스프링 부트 1.3.x 기반의 휴식 앱으로이 문제를 겪고 있었고, 문제를 진단하면서 스프링 툴 스위트가 최신 버전으로 업데이트되도록 허용했다.

    나는 스프링 부트 1.3.x 기반의 휴식 앱으로이 문제를 겪고 있었고, 문제를 진단하면서 스프링 툴 스위트가 최신 버전으로 업데이트되도록 허용했다.

    업데이트 된 STS에서 새로운 테스트 Spring Boot RestController를 만들었을 때 스프링 4.3에서 문서화 된 내용으로 광고가 작동했습니다. 나는 Maven 의존성이 새로운 테스트 어플리케이션에서 1.5.8로 뛰어 올랐다. 그래서 나는 오래된 어플리케이션이 스프링 부트 1.5.8 / spring 4.3.12로 업데이트되도록 의존성을 변경했다. 문제가 해결되어 OPTIONS 요청을 처리하는 데 관심이있는 RequestMapping 주석으로 광고 된 것처럼 작동합니다 ...

    @RequestMapping(value="/account/{id}", method={RequestMethod.OPTIONS,RequestMethod.GET})
    

    ... 이제 OPTIONS 요청을 처리기로 보냅니다.

    따라서 Spring의 최신 버전으로 업데이트 할 수 있다면, OPTIONS 요청 메소드 처리 (Spring 4.3.12 / Spring Boot 1.5.8)를 가능하게하기 위해 특별한 설정을 정의 할 필요가 없습니다.

  3. from https://stackoverflow.com/questions/33331042/how-to-handle-http-options-requests-in-spring-boot by cc-by-sa and MIT license