Я работаю над проектом, в котором используется встроенный Jetty (к сожалению, я просто «унаследовал» серверную часть проекта и не очень хорошо знаком с использованием Jetty и его конфигурацией).
Только что появился странный случай - я сделаю все возможное, чтобы описать:
Веб-интерфейс (с использованием AngularJS из другого домена, поэтому используется CORS) отправляет запрос POST, чтобы изменить состояние чего-либо на сервере. Это работало в какой-то момент в прошлом (последний раз оно использовалось, вероятно, месяц назад).
Вчера это перестало работать. Проверяя вызовы REST, я увидел, что сначала выполняется запрос OPTIONS. Тип содержимого POST — application/json, поэтому, исходя из того, что я прочитал, это правильно. Я не уверен, почему он ранее не был отправлен — возможно, компания недавно обновила свою версию Chrome, и старая версия не отправляла предварительные запросы, но это только предположение. В любом случае, вот, что я думаю, является соответствующим кодом в моем приложении для настройки Jetty для CORS:
FilterHolder holder = new FilterHolder(new CrossOriginFilter());
holder.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM, "*");
holder.setInitParameter(CrossOriginFilter.ACCESS_CONTROL_ALLOW_CREDENTIALS_HEADER, "true");
appHandler.addFilter(holder, "/*", EnumSet.of(DispatcherType.REQUEST));
Все отлично работает для POST-запросов. Я могу убедиться в этом, запустив Chrome с флагом --disable-web-security. Запрос OPTIONS не отправляется, а POST работает как надо.
Я думаю, что, поскольку он работает для POST, это не проблема авторизации или безопасности - просто Jetty не настроен должным образом для обработки запроса предварительной проверки (он просто возвращает 401).
Я не могу найти много документации для встроенного Jetty и какие из констант CrossOriginFilter использовать в качестве ключей свойств в вызовах setInitParameter (и, кроме того, поскольку 2-й аргумент этого вызова метода является строкой, я действительно понятия не имею, как отформатировать значения).
Какие параметры следует установить в CrossOriginFilter для обработки запросов свойств OPTIONS? И если я сказал выше что-то неправильное или сделал какие-то неверные предположения, пожалуйста, поправьте меня! У меня очень ограниченный опыт в этом.