Spring Boot проглатывает заголовки Access-Control-Request-Header на предварительном просмотре OPTIONS
У меня есть приложение Spring Boot REST с очень простым фильтром CORS. Я хочу динамически отвечать на значения в заголовке Access-Control-Request-Headers, а не предоставлять конкретный список. Кажется, что общепринятым является явное задание значений, возвращаемых в "Access-Control-Allow-Headers", однако мы будем составлять белый список наборов источников и захотим разрешить любые отправляемые ими заголовки. Я не могу найти способ повторить значение Access-Control-Allow-Headers в Access-Control-Request-Headers.
Вот код
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) servletResponse;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, PUT, GET, DELETE, OPTIONS"); // will need to enable other methods when/as implemented
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers",
((HttpServletRequest) servletRequest).getHeader("Access-Control-Request-Headers"));
filterChain.doFilter(servletRequest, servletResponse);
}
С этим запросом и ответом от Chrome (когда мы жестко программировали значение Access-Control-Allow-Headers)
Remote Address:10.199.240.16:443
Request URL:https://myapp.com/gradebooks/5566669e-e4b0-d05e-0150-98d7ffffffff/assignments/3ad7f1e7-679b-4d8b-856e-d2e3589eaad6
Request Method:OPTIONS
Status Code:200 OK
Response Headers
view source
Access-Control-Allow-Methods → POST, PUT, GET, DELETE, OPTIONS
Access-Control-Max-Age → 3600
Content-Type → application/hal+json; charset=UTF-8
Date → Tue, 21 Jul 2015 20:42:29 GMT
Server → Jetty(9.2.9.v20150224)
Transfer-Encoding → chunked
X-Application-Context → application
Request Headers
view source
Accept:*/*
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8
Access-Control-Request-Headers:accept, content-type
Access-Control-Request-Method:PUT
Connection:keep-alive
Host:gbservices-api.dev-prsn.com
Origin:http://localhost:3000
Referer:http://localhost:3000/
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36
Это ошибка
XMLHttpRequest не может загрузить https://myapp.com/gradebooks/5566669e-e4b0-d05e-0150-98d7ffffffff/assignments/3ad7f1e7-679b-4d8b-856e-d2e3589eaad6. Поле заголовка запроса Content-Type не разрешено Access-Control-Allow-Headers.
Что я обнаружил при отладке в фильтре, так это то, что Access-Control-Request-Headers и только этот заголовок отсутствуют к тому времени, когда он попадает в фильтр. Ошибочный заголовок, и он прибывает, так что кажется, что что-то перехватывает заголовок и отбрасывает его, прежде чем он попадет в мой фильтр...