Как работать с HTTP-опциями в Spring MVC? - PullRequest
27 голосов
/ 01 марта 2012

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

Ответы [ 5 ]

33 голосов
/ 02 марта 2012

Я добавил еще несколько деталей в ответ Божо для начинающих. Иногда полезно позволить Spring Controller управлять запросом 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 добавляет к ответу список разрешенных методов. В моем случае это было не важно, и я позволил этому уйти. Может быть, необходимы дальнейшие экзамены.

12 голосов
/ 01 марта 2012
@RequestMapping(value="/youroptions", method=RequestMethod.OPTIONS)
public View getOptions() {

}

Вы должны настроить диспетчерский сервлет, установив для dispatchOptionsRequest значение true

8 голосов
/ 02 апреля 2013

В качестве быстрого дополнения к вышеуказанным 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");
    }
3 голосов
/ 15 апреля 2013

Я выбрал следующий подход:

Использование Maven ( или вручную ) извлекает эту зависимость:

<dependency>
    <groupId>com.thetransactioncompany</groupId>
    <artifactId>cors-filter</artifactId>
    <version>1.3.2</version>
</dependency>

Это имеет реализацию для захвата всех входящихВАРИАНТЫ ЗАПРОСОВ.В файл 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>

Проблема, с которой я столкнулся при использовании подхода / **, заключается в том, что более конкретная реализация контроллера переопределит это.

0 голосов
/ 04 января 2015

Для Spring без файла web.xml и на основе ответа Пола Адамсона я просто установил параметр dispatchOptionsRequest в true в диспетчере, чтобы обрабатывать вызовы метода Options.

ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new        DispatcherServlet(applicationContext));

dispatcher.setInitParameter("dispatchOptionsRequest", "true");                

dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/*");
...