2016-01-19 1 views
3

IE11 по какой-то причине отклоняет запрос PUT, но только при использовании https. Мне очень трудно найти проблему, поскольку использование http, localhost и других браузеров прекрасно работает.IE11 CORS отклоняет ВАРИАНТЫ на https

Консоль показывает две ошибки

SEC7124: Request method PUT was not present in the Access-Control-Allow-Methods list. 
SCRIPT7002: XMLHttpRequest: Network Error 0x80070005, Access is denied. 

запрос OPTION передаваемое из браузера

Accept: */* 
Accept-Encoding: gzip, deflate 
Access-Control-Request-Headers: accept, content-type, session-id 
Access-Control-Request-Method: PUT 
Cache-Control: no-cache 
Connection: Keep-Alive 
Content-Length: 0 
Host: api.domain.com 
Origin: https://portal.domain.com 
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko 

и ответ от сервера следующее: используется

X-Powered-By: Servlet/2.5 
Server: server 
Content-Encoding: gzip 
Access-Control-Expose-Headers: Session-Id 
Access-Control-Allow-Origin: * 
Access-Control-Max-Age: -1 
Allow: OPTIONS,GET,HEAD,PUT 
Access-Control-Allow-Methods: OPTIONS, GET, POST, PUT, DELETE 
Access-Control-Allow-Credentials: true 
Access-Control-Allow-Headers: accept, origin, Content-Type, session-id, authorization, portal-url 
Content-Type: application/vnd.sun.wadl+xml 
Content-Length: 352 
Date: Tue, 19 Jan 2016 15:33:38 GMT 

AngularJS на клиентской стороне используется стандарт $ http PUT. Java с джерси используются на стороне сервера и запрос фильтр для обработки CORS является следующим:

public ContainerResponse filter(final ContainerRequest request, final ContainerResponse response) 
{ 
    if (request.getHeaderValue("Origin") != null) 
    { 
     final MultivaluedMap<String, Object> headers = response.getHttpHeaders(); 
     headers.add("Access-Control-Allow-Origin", "*"); 
     headers.add("Access-Control-Expose-Headers", "Session-Id"); 
     headers.add("Access-Control-Allow-Credentials", Boolean.TRUE.toString()); 
    } 

    if ("OPTIONS".equals(request.getMethod())) 
    { 
     final MultivaluedMap<String, Object> headers = response.getHttpHeaders(); 
     for (String method : ["OPTIONS", "GET", "POST", "PUT", "DELETE"]) 
     { 
      headers.add("Access-Control-Allow-Methods", method); 
     } 
     headers.add("Access-Control-Allow-Headers", 
       "accept, origin, Content-Type, session-id, authorization, portal-url, " 
       + "If-Modified-Since, Cache-Control, Pragma"); 
     headers.add("Access-Control-Max-Age", "-1");    
    } 

    return response; 
} 

Может быть, вы можете увидеть, что может быть не так с этим.

Thanks

+0

Попробуйте установить фактическое происхождение, а не '*' – charlietfl

+0

Проверьте наличие ошибок в консоли IE (F12, чтобы открыть devtools). Должно быть сообщение, описывающее, почему браузер отклонил запрос. Из головы - разрешить учетные данные = true должно сопровождаться возникновением не-звездочки. –

+0

@ Сообщение об ошибке OlegEstekhin находится прямо у вопроса OP – charlietfl

ответ

2

Мне удалось найти проблему.

Я видел эту проблему на https только потому, что портал и хост, где на разных доменах. Я не мог реплицировать проблему на localhost, потому что сервер и портал находятся в этом же домене. Это означает, что запрос OPTION не был отправлен, и все работало должным образом. После запуска портала на локальном хосте и использования IP-адреса в качестве URL-адреса сервера вместо локального хоста в запрос был включен запрос OPTION, и я мог бы реплицировать мою проблему.

И вопрос это сам был до следующего кода на сервере

for (String method : ["OPTIONS", "GET", "POST", "PUT", "DELETE"]) 
    { 
     headers.add("Access-Control-Allow-Methods", method); 
    } 

по какой-то причине IE не как рассеянный Access-Control-Allow-Methods заголовки. После изменения кода проблема была решена.

List<String> ALLOWED_METHODS = Arrays.asList("OPTIONS", "GET", "POST", "PUT", "DELETE"); 
headers.add("Access-Control-Allow-Methods", ALLOWED_METHODS); 
Смежные вопросы