当前位置: 首页 > 面试题库 >

IE11 CORS拒绝https上的选项

谷梁子濯
2023-03-14
问题内容

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.

从浏览器发送的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。服务器端使用带有jersey的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;
}

也许您可以看到问题所在。

谢谢


问题答案:

我设法找到了问题。

我在https上看到此问题的原因仅在于门户网站和主机位于不同的域中。我无法在本地主机上复制该问题,因为服务器和门户都在同一域中。这意味着未发送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 );


 类似资料:
  • 我试图测试一个具有类似下面的ELB的REST API:https://systemtest-inventory.com/v1/inventory/getinventory 当我用邮差chrome尝试URL时,它给了我有效的响应。但当我尝试在Java程序中使用它时,如下所示:

  • 我知道在类似问题上已经发布了一些问题,但不幸的是,我仍然无法使以下命令正常工作: $sudo docker run hello world 无法在本地找到映像“hello world:latest”:docker:来自守护程序的错误响应:Gethttps://registry-1.docker.io/v2/: 拨打tcp 52.54.216.153:443:getsockopt:连接被拒绝。请参阅

  • Docker安装在AWS EC2 Ubuntu 16.04实例上,如下所示: 引发权限被拒绝错误: 尝试连接到处的Docker守护程序套接字时,权限被拒绝unix:///var/run/docker.sock: 收到http:///var/run/docker.sock/v1.39/info: 拨号unix/var/run/docker.sock:connect:权限被拒绝 显示: uname-a

  • 有很多人提到这个错误,但是, 下面是为lambda()创建的执行角色: 其中

  • 我已设法破坏了我的安装,每当我尝试使用安装包时,我都会收到以下错误消息: 未处理的拒绝错误:eAcces:权限被拒绝,打开“/users/marknorgate/.npm/_cacache/TMP/A449402d”