Spring Data REST CORS - как обработать предполётный запрос OPTIONS?
Я использую Spring Data REST для создания RESTful API. До сих пор мой HTML GUI для этого сервиса RESTful обслуживался с того же Tomcat, и у меня не было проблем с запросами Cross Origin.
Теперь я хочу обслуживать статические файлы с другого сервера. Это означает, что API находится в другом домене / порту. Браузеры отправят запрос OPTIONS для получения заголовков Access-Control с сервера. К сожалению, Spring Data REST не обрабатывает эти запросы OPTIONS и даже возвращает HTTP 500.
Я попытался создать пользовательский контроллер, который обрабатывает все запросы OPTIONS
@Controller
@RequestMapping(value = "/**", method = RequestMethod.OPTIONS)
public class OptionsController {
@RequestMapping
public ResponseEntity options() {
return new ResponseEntity<Void>(HttpStatus.OK);
}
}
Который работал для OPTIONS, но затем все другие запросы (например, GET) перестали работать.
Запросы OPTIONS включаются с помощью параметра сервлета диспетчера dispatchOptionsRequest.
2 ответа
Просто установите параметр dispatchOptionsRequest
в true
в диспетчер для обработки Options
вызовы методов, в реализацию WebApplicationInitializer
,
ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new DispatcherServlet(applicationContext));
dispatcher.setInitParameter("dispatchOptionsRequest", "true");
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/*");
tl;dr: в настоящий момент Spring Data REST не отвечает OPTIONS
запросы вообще.
Возможно, стоит открыть билет в нашей JIRA.
Браузеры отправят запрос OPTIONS для получения заголовков Access-Control с сервера.
Это указано где-то? Если это так, было бы здорово, если бы в описании билета была ссылка на эту спецификацию.
Несколько комментариев относительно вашего подхода к обходному пути:
@RequestMapping
на методе контроллера переопределяетmethod
атрибут и, как ожидается, теперь соответствует всем методам HTTP, поэтому вы видите, что все запросы перехвачены. Так что вам нужно определитьOPTIONS
в качестве метода HTTP тоже (или, может быть, вместо отображения классов).- Ты не вернешь
Allow
заголовок, который является всей цельюOPTIONS
на первом месте. - Интересно, имеет ли этот подход смысл, так как в целом о поддерживаемых методах HTTP будет сложно рассуждать.