Java IE11 CORS拒绝https上的选项

Java IE11 CORS拒绝https上的选项,java,angularjs,jersey,cors,internet-explorer-11,Java,Angularjs,Jersey,Cors,Internet Explorer 11,IE11出于某种原因拒绝了PUT请求,但仅当我使用https时。 我很难找到这个问题,因为使用http、localhost和其他浏览器可以很好地工作 控制台显示两个错误 SEC7124: Request method PUT was not present in the Access-Control-Allow-Methods list. SCRIPT7002: XMLHttpRequest: Network Error 0x80070005, Access is denied. 从浏览器发送

IE11出于某种原因拒绝了PUT请求,但仅当我使用https时。 我很难找到这个问题,因为使用http、localhost和其他浏览器可以很好地工作

控制台显示两个错误

SEC7124: Request method PUT was not present in the Access-Control-Allow-Methods list.
SCRIPT7002: XMLHttpRequest: Network Error 0x80070005, Access is denied.
从浏览器发送的选项请求无效

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
 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;
}
AngularJS用于客户端,使用标准$http PUT。 服务器端使用Java with jersey,处理CORS的请求过滤器如下所示:

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
 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;
}
公共ContainerResponse筛选器(最终ContainerRequest请求,最终ContainerResponse响应)
{
if(request.getHeaderValue(“Origin”)!=null)
{
final MultivaluedMap headers=response.getHttpHeaders();
headers.add(“访问控制允许原点”、“*”);
添加(“访问控制公开头”、“会话Id”);
headers.add(“访问控制允许凭据”,Boolean.TRUE.toString());
}
if(“OPTIONS”.equals(request.getMethod()))
{
final MultivaluedMap headers=response.getHttpHeaders();
对于(字符串方法:[“选项”、“获取”、“发布”、“放置”、“删除”])
{
添加(“访问控制允许方法”,方法);
}
添加(“访问控制允许标头”,
接受、来源、内容类型、会话id、授权、门户url、
+“如果自修改,则缓存控制,Pragma”);
标题。添加(“访问控制最大年龄”,“-1”);
}
返回响应;
}
也许你能看出这有什么问题


谢谢

我已经找到了问题所在

我在https上看到这个问题只是因为门户和主机位于不同的域上。我无法在localhost上复制此问题,因为服务器和门户都位于同一个域上。这意味着没有发送选项请求,并且一切都按预期进行。在localhost上运行门户并使用IP地址作为服务器URL(而不是localhost)后,选项请求包含在请求中,我可以复制我的问题

问题就在于服务器上的以下代码

    for ( String method : ["OPTIONS", "GET", "POST", "PUT", "DELETE"] ) 
    {
        headers.add( "Access-Control-Allow-Methods", method );
    }
出于某种原因,IE不喜欢多个
访问控制允许方法
头。将代码更改为后,以下问题得到解决

 List<String> ALLOWED_METHODS = Arrays.asList( "OPTIONS", "GET", "POST", "PUT", "DELETE" );
 headers.add( "Access-Control-Allow-Methods", ALLOWED_METHODS );
List ALLOWED_METHODS=Arrays.asList(“选项”、“获取”、“发布”、“放置”、“删除”);
添加(“访问控制允许方法”,允许的方法);

尝试设置实际原点,而不是
*
检查IE控制台(F12打开devtools)中的错误。应该有一条消息描述浏览器拒绝请求的原因。出头-allow credentials=true应伴有非星型的allow origin。@OlegEstekhin错误消息位于OP的顶部question@OlegEstekhin是错误为SEC7124:访问控制允许方法列表中不存在请求方法PUT。SCRIPT7002:XMLHttpRequest:网络错误0x80070005,访问被拒绝。但是如何避免像api这样的响应中的*也将从移动设备中使用,并且它们没有静态原始设置完整的原始设置,也没有*作为允许原始标题。另外,仅在allow methods标头中设置PUT。让我知道它是否有效。