Подтвердить что ты не робот

Как обрабатывать запросы HTTP OPTIONS в Spring Загрузка?

Во-первых, я прочитал "Как обрабатывать ВАРИАНТЫ HTTP с помощью Spring MVC?", но ответы не кажутся непосредственно применимыми к Spring Boot.

Похоже, я должен это сделать:

настроить диспетчерServlet, установив его dispatchOptionsRequest до 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.RELEASE; простая настройка, не очень отличная от той, что находится в Spring REST guide.

4b9b3361

Ответ 1

Вариант 1: Spring Свойства загрузки (Spring Только загрузочная версия 1.3.0+)

Начиная с Spring Boot 1.3.0, это поведение можно настроить следующим образом:

spring.mvc.dispatch-options-request=true

Вариант 2: Пользовательский DispatcherServlet

DispatcherServlet в Spring Загрузка определяется 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 отключит автоматическую настройку, поэтому вы должны вручную определить другой beans, объявленный в классе автоконфигурации, а именно 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 не выполняется при запуске вашего приложения Spring Boot с помощью метода main.

Ответ 2

Я столкнулся с этой проблемой с приложением для загрузки Spring Boot 1.3.x и при диагностике проблемы я разрешил обновлять свою версию пакета инструментов Spring до последней версии.

Когда я создал новый тест Spring Boot RestController в обновленном STS, он работал как документация, объявленная в Spring 4.3. Я заметил, что зависимость Maven переместилась в Spring boot 1.5.8 в новом тестовом приложении, поэтому я просто изменил зависимость старого приложения, чтобы обновить его до Spring boot 1.5.8/Spring 4.3.12, Это устранило проблему, и теперь она работает с рекламой с аннотацией RequestMapping, указывающей на интерес к обработке запросов OPTIONS...

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

... теперь отправляет запрос OPTIONS обработчику.

Итак, если вы можете обновить до более поздней версии Spring, вам не нужно будет определять какие-либо специальные конфигурации для того, чтобы разрешить обработку метода запросов OPTIONS (Spring 4.3.12/Spring Boot 1.5 0,8).