当前位置: 首页 > 面试题库 >

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

陆畅
2023-03-14
问题内容

看来我应该这样做:

通过将其设置为dispatchOptionsRequest来配置dispatcherServlet true

但是,考虑到我没有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);
}

Spring Boot 1.2.7.RELEASE; 一个简单的设置与Spring REST指南并没有太大区别 。


问题答案:

选项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;
}

但是请注意,定义你的DispatcherServletbean将禁用自动配置,因此你应该手动定义在autoconfiguration类中声明的其他bean,即ServletRegistrationBeanfor DispatcherServlet

选项3: BeanPostProcessor

你可以创建BeanPostProcessor将bean初始化之前将dispatchOptionsRequest属性设置为的实现true。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应用程序时不会执行代码。



 类似资料:
  • 我相信这是一个简单的问题,但我找不到答案或至少在搜索中使用正确的术语。 我正在一起设置和。默认情况下,将使用和等路径。 如果可能的话,我希望避免使用path作为哈希。正如Angular文档所述: 路由器的provideRouter函数将LocationStrategy设置为PathLocationStrategy,使其成为默认策略。如果我们愿意,我们可以在引导过程中切换到带有重写的HashLoca

  • 问题内容: 我想知道如何以n为一组进行ajax调用。 这是我的用例: 我有一个显示使用情况数据的表。您可以钻取每一行,如果每行都有一个可以更深入钻取的公共属性,则可以选择一次钻取所有它们。对于每一行,都会进行ajax调用以获取要附加到表中的数据。 在某些情况下,最多可以同时钻取50行。可以想象,这给服务器带来了很大压力。我如何最好地以较小的批次发送这些呼叫,这些呼叫在等待这些批次之后才能启动? 我

  • 我是web服务新手,正在阅读Martin Kalin的《Java Webservices》一书。我已经了解了它最初的基本概念,有一个问题: 假设将HTTP请求(包含SOAP消息信封)发送到JavaWeb服务()。该请求是否由Servlet内部处理,Servlet提取SOAP消息并将其转换为相应Java域对象,然后调用服务实现bean? 无论Metro和Axis等现成框架如何,这个问题都是通用的。只

  • 问题内容: 我相信这是一个简单的问题,但我找不到答案,或者至少在搜索中使用正确的字词。 我正在设置并在一起。默认情况下,Angular将使用和之类的路径。 如果可能的话,我想避免使用path作为哈希值。如Angular 文档所述: 路由器的r函数将设置为,使其成为默认策略。如果愿意,我们可以在引导过程中使用覆盖切换到。 然后… 几乎所有Angular 2项目都应使用默认的HTML 5样式。它产生的

  • 首先,我阅读了“如何使用Spring MVC处理HTTP选项?”但答案似乎并不直接适用于Spring Boot。 看起来我应该这么做: 通过将dispatcherServlet的设置为 但是,考虑到我的代码中没有XML配置,也没有任何种类的初始化器类(在这个答案中提到),如何做到这一点呢? 在一个类中,我有一个这样的方法,它目前没有被调用。 Spring靴1.2.7。释放一个简单的设置与Sprin

  • 我有一个在数据库上运行查询的API。由于查询执行时间可能很长,比如3分钟到10分钟,我的负载平衡器返回“上游请求超时”,但我可以看到查询已提交到数据源,但对最终用户来说,它显示了错误的消息。如何应对这种情况? 我的职能