gpt4 book ai didi

spring - 如何在 Spring Boot 中处理 HTTP OPTIONS 请求?

转载 作者:IT老高 更新时间:2023-10-28 13:47:14 28 4
gpt4 key购买 nike

首先,我已阅读“How to handle HTTP OPTIONS with Spring MVC?”,但答案似乎并不直接适用于 Spring Boot。

看来我应该这样做:

configure the dispatcherServlet by setting its dispatchOptionsRequest to true

但是如何做到这一点,因为我的代码中没有 XML 配置或任何类型的 DispatcherServlet 初始化程序类 (mentioned by this answer)?

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

Spring Boot 1.2.7.RELEASE;一个简单的设置,与 Spring REST guide 中的设置没有太大区别.

最佳答案

选项 1:Spring Boot 属性(仅限 Spring Boot 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 将禁用自动配置,因此您应该手动定义在自动配置类中声明的其他 bean,即 ServletRegistrationBean对于 DispatcherServlet .

选项 3:BeanPostProcessor

您可以创建 BeanPostProcessor实现将设置 dispatchOptionsRequest归属于 true在 bean 初始化之前。 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;
}
}

选项 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 部署到 Servlet 容器中时,这才有效,如 SpringBootServletInitializer使用 main 运行 Spring Boot 应用程序时代码未执行方法。

关于spring - 如何在 Spring Boot 中处理 HTTP OPTIONS 请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33331042/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com