스프링 부트에서의 HTTP OPTIONS 요청 처리 방법
먼저 "Spring MVC를 사용한HTTP OPTIONS 처리 방법"을 읽었습니다만, Spring Boot에 직접 해당하는 것은 아닌 것 같습니다.
이렇게 해야 할 것 같습니다.
dispatcher Servlet 설정
dispatchOptionsRequest
로.true
그러나 XML 구성이나 다양한 기능이 없기 때문에 어떻게 해야 합니까?DispatcherServlet
initializer 클래스(이 답변에 기재되어 있습니다)는 무엇입니까?
에@RestController
class, 저는 현재 호출되지 않는 이런 방법을 가지고 있습니다.
@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
DispatcherServlet
Spring Boot의 정의는 다음과 같습니다.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은 자동 설정을 디세블로 하기 때문에 자동 설정 클래스에서 선언된 다른 콩, 즉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
가지고 있다면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");
}
}
단, 어플리케이션을 서블릿컨테이너에 WAR로 도입했을 경우에만 동작합니다.SpringBootServletInitializer
Spring 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
'bestsource' 카테고리의 다른 글
앱 렌더링 html 엔티티(예: 앰퍼샌드)를 이스케이프로 응답 (0) | 2023.03.25 |
---|---|
TypeScript에서 "keyof 확장"과 "keyof 입력"은 무엇을 의미합니까? (0) | 2023.03.25 |
WordPress 플러그인이 설치되어 활성화되었는지 확인하는 방법 (0) | 2023.03.25 |
새 사용자가 생성/등록될 때 트리거되는 액션 후크는 무엇입니까? (0) | 2023.03.25 |
React JS 상태 vs 프로펠러 (0) | 2023.03.25 |