#spring #cors #spring-data-rest #http-options-method
#spring #cors #spring-data-rest #http-options-метод
Вопрос:
Я использую Spring Data REST для создания RESTful API. До сих пор мой HTML-графический интерфейс для этой RESTful-службы обслуживался с того же Tomcat, и у меня не было проблем с перекрестными исходными запросами.
Теперь я хочу обслуживать статические файлы с другого сервера. Это означает, что API находится на другом домене / порту. Браузеры отправят запрос ПАРАМЕТРОВ, чтобы получить заголовки управления доступом с сервера. К сожалению, Spring Data REST не обрабатывает эти запросы параметров и даже возвращает HTTP 500.
Я попытался создать пользовательский контроллер, который обрабатывает все запросы параметров
@Controller
@RequestMapping(value = "/**", method = RequestMethod.OPTIONS)
public class OptionsController {
@RequestMapping
public ResponseEntity options() {
return new ResponseEntity<Void>(HttpStatus.OK);
}
}
Который работал для ПАРАМЕТРОВ, но затем все остальные запросы (например, GET) перестали работать.
Запросы ПАРАМЕТРОВ включаются с помощью параметра сервлета dispatchOptionsRequest dispatcher.
Комментарии:
1. Вы пробовали фильтр CORS от Tomcat?
2. Нет. Проблема исправлена в SDR в следующей версии. Мы просто использовали обратный прокси для сопоставления запросов с тем же доменом и портом.
Ответ №1:
tl; dr: в настоящее время Spring Data REST вообще не отвечает OPTIONS
на запросы.
Возможно, стоит открыть тикет в нашем JIRA.
Браузеры отправят запрос ПАРАМЕТРОВ, чтобы получить заголовки управления доступом с сервера.
Это где-то указано? Если это так, было бы здорово, если бы в описании билета была ссылка на эту спецификацию.
Несколько комментариев относительно вашего подхода к обходному пути:
@RequestMapping
на контроллере метод переопределяетmethod
атрибут и, как ожидается, теперь соответствует всем методам HTTP, поэтому вы видите, что все запросы перехвачены. Итак, вам также нужно определитьOPTIONS
как HTTP-метод там (или, может быть, вместо сопоставления классов).- Вы не возвращаете какой-либо
Allow
заголовок, который является основной цельюOPTIONS
в первую очередь. - Интересно, имеет ли смысл подход в целом, поскольку будет сложно рассуждать о поддерживаемых методах HTTP в целом.
Комментарии:
1. Спасибо за ответ! Я попробовал 1), должен был опубликовать это. Не сработало. Как только я регистрирую свой контроллер, метод экспорта данных REST не работает. Заголовки добавляются в фильтр. Пункт 3, ну, я думаю, что CORS является распространенной проблемой и должен поддерживаться, особенно для REST API.
2. Я открыл jira.spring.io/browse/DATAREST-333 . Включены ссылки на w3c и mozilla.
3. @OliverGierke Я заметил, что Spring Data REST устанавливает заголовок разрешить методы, используя org.springframework.http. HttpHeaders. РАЗРЕШИТЬ, для которого установлено значение «Разрешить». В соответствии с этой рекомендацией W3C , имя заголовка должно быть Access-Control-Allow-Methods . Почему это несоответствие?
4. В настоящее время мы просто реализуем метод HTTP OPTIONS, как определено в спецификации.
Ответ №2:
Просто установите параметр dispatchOptionsRequest
true
в диспетчер для обработки Options
вызовов методов в реализацию WebApplicationInitializer
.
ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new DispatcherServlet(applicationContext));
dispatcher.setInitParameter("dispatchOptionsRequest", "true");
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/*");