Я хотел бы перехватить запрос 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("/*");