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

Как обрабатывать ВАРИАНТЫ HTTP с помощью Spring MVC?

Я хотел бы перехватить запрос OPTIONS с моим контроллером с помощью Spring MVC, но он улавливается DispatcherServlet. Как я могу это сделать?

4b9b3361

Ответ 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("/*");