Я хотел бы перехватить запрос OPTIONS с моим контроллером с помощью Spring MVC, но он улавливается DispatcherServlet. Как я могу это сделать?
Как обрабатывать ВАРИАНТЫ HTTP с помощью Spring MVC?
Ответ 1
@RequestMapping(value="/youroptions", method=RequestMethod.OPTIONS)
public View getOptions() {
}
Вы должны настроить диспетчерServlet, установив его dispatchOptionsRequest на true
Ответ 2
Я добавил несколько подробностей к ответу Божо для новичков. Иногда полезно, чтобы контроллер Spring управлял запросом OPTIONS (например, чтобы установить правильный заголовок "Access-Control-Allow- *" для вызова AJAX). Однако, если вы попробуете обычную практику
@Controller
public class MyController {
    @RequestMapping(method = RequestMethod.OPTIONS, value="/**")
    public void manageOptions(HttpServletResponse response)
    {
        //do things
    }
}
Он не будет работать, поскольку DispatcherServlet перехватит запрос клиента OPTIONS.
Обходной путь очень прост:
Вам нужно... настроить DispatcherServlet из вашего файла web.xml следующим образом:
...
  <servlet>
    <servlet-name>yourServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>dispatchOptionsRequest</param-name>
      <param-value>true</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
...
Добавление параметра "dispatchOptionsRequest" и установка его в значение true.
Теперь DispatcherServlet делегирует обработку OPTIONS вашему контроллеру, и будет выполняться метод manageOption().
Надеюсь, что это поможет.
PS. если честно, я вижу, что DispatcherServlet добавляет список разрешенных методов к ответу. В моем случае это было неважно, и я отпустил это дело. Возможно, необходимы дополнительные обследования.
Ответ 3
В качестве быстрого дополнения к вышеуказанным 2 ответам здесь, как включить dispatchOptionsRequest в среде сервлета 3 (без web.xml), так как мне потребовалось некоторое время, чтобы решить, как применять ответы выше в настройке, отличной от xml.
В среде spring 3.2/servlet 3 у вас будет несколько классов инициализатора DispatcherServlet, который является java-эквивалентом web.xml; в моем случае это AbstractAnnotationConfigDispatcherServletInitializer. Добавление следующего кода позволит dispatchOptionsRequest:
    @Override
    protected void customizeRegistration(Dynamic registration) {
        registration.setInitParameter("dispatchOptionsRequest", "true");
    }
Ответ 4
Я принял следующий подход:
Используя Maven (или вручную) втяните эту зависимость:
<dependency>
    <groupId>com.thetransactioncompany</groupId>
    <artifactId>cors-filter</artifactId>
    <version>1.3.2</version>
</dependency>
У этого есть реализация, чтобы захватить все входящие запросы OPTIONS. В файл web.xml добавьте следующую конфигурацию:
<filter>
   <filter-name>CORS</filter-name>
   <filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>       
   <init-param>
      <param-name>cors.supportedHeaders</param-name>
      <param-value>Content-Type,Accept,Origin</param-value>
   </init-param>
</filter>
<filter-mapping>
   <filter-name>CORS</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>
Проблема, которую я видел с помощью метода /**, - это более конкретная реализация контроллера, которая переопределит это.
Ответ 5
Для Spring без файла web.xml и на основе ответа Пола Адамсона я просто установил параметр dispatchOptionsRequest в true в диспетчер для обработки вызовов метода Options.
ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new        DispatcherServlet(applicationContext));
dispatcher.setInitParameter("dispatchOptionsRequest", "true");                
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/*");
