当前位置: 首页 > 知识库问答 >
问题:

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

明松
2023-03-14

首先,我阅读了“如何使用Spring MVC处理HTTP选项?”但答案似乎并不直接适用于Spring Boot。

看起来我应该这么做:

通过将dispatcherServlet的DispatchOptions Request设置为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靴1.2.7。释放一个简单的设置与Spring REST guide中的设置没有太大区别。

共有3个答案

冷正青
2023-03-14

使用Spring Boot 2.2.6,您可以轻松地将自定义方法选项添加到StrictHttpFirewall

@Bean
public StrictHttpFirewall httpFirewall() {

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

    return firewall;
}
逄学潞
2023-03-14

我在使用基于Spring Boot 1.3. x的rest应用程序时遇到了这个问题,在诊断问题时,我允许我的Spring工具套件更新到最新版本。

当我在更新的STS中创建一个新的test Spring Boot RestController时,它就像Spring 4.3下的文档宣传一样工作。我注意到,在新的测试应用程序中,Maven依赖项跳到了spring boot 1.5.8,所以我只是更改了旧应用程序的依赖项,将其更新为spring boot 1.5.8/spring 4.3.12。这解决了这个问题,现在它的工作方式与RequestMapping注释一样,它指定了处理选项请求的兴趣。。。

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

... 现在将选项请求发送给处理程序。

因此,如果您能够更新到更高版本的Spring,您应该不需要定义任何特殊配置来启用OPTIONS请求方法处理(Spring 4.3.12/Spring Boot 1.5.8)。

白念
2023-03-14

从Spring Boot 1.3.0开始,可以使用以下属性配置此行为:

spring.mvc.dispatch-options-request=true

SpringBoot中的DispatcherServlet由DispatcherServletAutoConfigance定义。您可以在配置类中的某个位置创建自己的DispatcherServletbean,它将代替自动配置中的bean使用:

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

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

您可以创建BeanPostProcessor实现,它将在初始化bean之前将DispatchOptions请求属性设置为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;
    }
}

如果您的应用程序中有SpringBootServletializer,您可以执行以下操作来启用选项分派:

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容器中时,这才有效,因为当使用main方法运行你的Spring Boot应用程序时,SpringBootServletializer代码不会被执行。

 类似资料:
  • 问题内容: 看来我应该这样做: 通过将其设置为来配置dispatcherServlet 但是,考虑到我没有XML配置,或者代码中没有任何各种初始化程序类(此答案提到),该怎么做? 在一个类中,我有一个像这样的方法,当前不会被调用。 Spring Boot 1.2.7.RELEASE; 一个简单的设置与Spring REST指南并没有太大区别 。 问题答案: 选项1:Spring Boot属性(仅适

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

  • 我们有几个域对象具有可为空的字段。我们已经读到hibernate需要“raw”对象来正确映射它,所以我们的getter返回optionals。我们的域对象如下所示: 但现在我们在解决/绑定这些字段时遇到了问题。jspx文件。(显示和表单输入字段。)对于基本类型和字符串,我们可以通过定义自定义OptionalToStringConverter绕过这一点。 对其他域对象的可空引用仍然是一个问题。 我们

  • 通常用于HTTP/HTTPS请求失败/成功等处理. 进程: 主进程​ IncomingMessage是由 EventEmitter响应可读流接口 实例事件 事件: 'data' 用途:响应或回调传送到应用的数据 chunk Buffer - 响应正文的数据块. 事件: 'end' 触发:响应正文已结束时 事件: 'aborted' 触发:正在进行的HTTP事务期间请求已取消时 事件: 'error

  • 我正在使用Amazon SNS在我的HTTP/HTTPSendpoint上接收推送消息。endpoint应用程序是用Django编写的。要在endpoint(web app)上接收通知,HTTP/HTTPSendpoint需要订阅一个主题。 我的问题是当Amzaon SNS发送订阅确认时,它如何在POST请求中发送CSRF令牌,以便我处理请求并检索所需信息? 文档:http://docs.aws.

  • 问题内容: 我已经实现了当前的一组路由(例如): 他们工作得很漂亮。现在,假设我要为同一API实现“批处理终结点”。它看起来应该像这样: 身体应该像这样: 为此,我想知道如何调用播放框架路由器来传递这些请求?我打算使用与单元测试建议类似的方法: 通过进入的源代码,您会发现如下所示: 所以我的问题是:与复制上面的代码相比,用Play做到这一点的方式是否更简单(我不反对将Scala和Java混合使用)