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 с сервера.

Это указано где-то? Если это так, было бы здорово, если бы в описании билета была ссылка на эту спецификацию.

Несколько комментариев относительно вашего подхода к обходному пути:

  1. @RequestMapping на методе контроллера переопределяет method атрибут и, как ожидается, теперь соответствует всем методам HTTP, поэтому вы видите, что все запросы перехвачены. Так что вам нужно определить OPTIONS в качестве метода HTTP тоже (или, может быть, вместо отображения классов).
  2. Ты не вернешь Allow заголовок, который является всей целью OPTIONS на первом месте.
  3. Интересно, имеет ли этот подход смысл, так как в целом о поддерживаемых методах HTTP будет сложно рассуждать.
Другие вопросы по тегам