bestsource

스프링 부트에서의 HTTP OPTIONS 요청 처리 방법

bestsource 2023. 3. 25. 11:38
반응형

스프링 부트에서의 HTTP OPTIONS 요청 처리 방법

먼저 "Spring MVC를 사용한HTTP OPTIONS 처리 방법"을 읽었습니다만, Spring Boot에 직접 해당하는 것은 아닌 것 같습니다.

이렇게 해야 할 것 같습니다.

dispatcher Servlet 설정dispatchOptionsRequest로.true

그러나 XML 구성이나 다양한 기능이 없기 때문에 어떻게 해야 합니까?DispatcherServletinitializer 클래스(이 답변에 기재되어 있습니다)는 무엇입니까?

@RestControllerclass, 저는 현재 호출되지 않는 이런 방법을 가지고 있습니다.

@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릴리스: Spring REST 가이드의 설정과 크게 다르지 않은 간단한 설정.

옵션 1: 스프링 부트 속성(스프링 부트 1.3.0+만 해당)

Spring Boot 1.3.0 이후에서는 다음 속성을 사용하여 이 동작을 설정할 수 있습니다.

spring.mvc.dispatch-options-request=true

옵션 2: 커스텀DispatcherServlet

DispatcherServletSpring Boot의 정의는 다음과 같습니다.DispatcherServletAutoConfiguration독자적인 것을 작성할 수 있습니다.DispatcherServletbean은 컨피규레이션클래스 내 어딘가에서 자동 설정 대신 사용됩니다.

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

하지만 주의하세요.DispatcherServletbean은 자동 설정을 디세블로 하기 때문에 자동 설정 클래스에서 선언된 다른 콩, 즉ServletRegistrationBean위해서DispatcherServlet.

옵션 3:BeanPostProcessor

생성할 수 있습니다.BeanPostProcessor를 설정하는 실장dispatchOptionsRequest의 탓으로 돌리다true빈이 초기화되기 전에.이것은 컨피규레이션클래스의 어딘가에 배치할 수 있습니다.

@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;
    }
}

옵션 4:SpringBootServletInitializer

가지고 있다면SpringBootServletInitializerOPTIONS 디스패치를 유효하게 하려면 , 다음과 같은 조작을 실시할 수 있습니다.

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");
    }
}

단, 어플리케이션을 서블릿컨테이너에 WAR로 도입했을 경우에만 동작합니다.SpringBootServletInitializerSpring Boot 앱을 실행할 때 코드가 실행되지 않습니다.main방법.

Spring Boot 1.3.x 기반의 레스트 앱에서 이 문제가 발생했는데, 문제를 진단하는 동안 Spring Tool Suite를 최신 버전으로 업데이트하도록 했습니다.

업데이트된 STS에서 새로운 테스트 Spring Boot Rest Controller를 작성했을 때 Spring 4.3에 기재된 매뉴얼에 따라 동작했습니다.새로운 테스트 앱에서 Maven 의존성이 스프링 부트 1.5.8로 뛰어오른 것을 알고, 오래된 앱 의존성을 스프링 부트 1.5.8/스프링 4.3.12로 업데이트하도록 변경했습니다.이것으로 문제가 해결되어 OPTIONS 요청 처리에 관심이 있음을 나타내는 RequestMapping 주석과 함께 애드버타이즈된 대로 작동합니다.

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

이제 OPTIONS 요청을 핸들러로 전송합니다.

따라서 스프링의 최신 버전으로 업데이트할 수 있는 경우 OPTIONS 요청 방식 처리(Spring 4.3.12/Spring Boot 1.5.8)를 활성화하기 위해 특별한 구성을 정의할 필요가 없습니다.

메서드는 간단하게 할 수 .OPTIONS로로 합니다.StrictHttpFirewall.2의 경우: Spring Boot 2.2.6의 경우:

@Bean
public StrictHttpFirewall httpFirewall() {

    StrictHttpFirewall firewall = new StrictHttpFirewall();
    firewall.setAllowedHttpMethods(Arrays.asList("GET", "POST", "OPTIONS", "FOO"));

    return firewall;
}

언급URL : https://stackoverflow.com/questions/33331042/how-to-handle-http-options-requests-in-spring-boot

반응형