使用IE11的CORS请求

时间:2013-11-25 16:54:33

标签: jquery cors internet-explorer-11

我有一个CORS(跨域资源共享)请求,从我的登录页面到另一个URL上的应用程序站点。我有一个简单的页面我ping以确定用户是否已经登录,如果是,则重定向它们。否则我会显示一个登录页面。我使用jQuery。

这在safari,chrome,firefox中很有用......而不是IE(自然)。根据MS,IE 10及更高版本应该支持CORS requests with withCredentials

我正在使用jquery-2.0.3.min.js

为什么这在IE11中不起作用?

编辑:看起来它部分正常工作,因为它现在返回值{“id”:false}。每次都会发生这种情况,这意味着服务器永远不会获得凭据。我也发布了我的is_logged_in页面,我正在使用代码点火器框架。

编辑:在IE的安全设置下启用“允许跨域的数据源”后,我不再收到任何错误消息。

我收到的确切错误是:

  

SEC7118:http://mysite.net/guest/is_logged_in的XMLHttpRequest需要跨源资源共享(CORS)。

$.ajax({
url: 'http://mysite.net/guest/is_logged_in',
type: 'POST',
crossDomain: true,
xhrFields: {
       withCredentials: true
  },

dataType: 'json',
success: function(data) {

    if(data.id) {
        window.location.replace("http://mysite.net");
    }
}
});

public function is_logged_in()
{
    $allowed = array(
        'http://mysite.net',
        'http://www.mysite.net',
        'http://www.mysite.com',
    );

    $url = $_SERVER['HTTP_REFERER'];
    $url = substr($url, 0, strpos($url, '/', 8));
    if(isset($_SERVER['HTTP_ORIGIN']))
    {
        if(in_array($_SERVER['HTTP_ORIGIN'], $allowed))
        {
            $this->output->set_header('Access-Control-Allow-Origin: ' . $_SERVER['HTTP_ORIGIN']);
        }
    }
    else
    {
        if(in_array($url, $allowed))
        {
            $this->output->set_header('Access-Control-Allow-Origin: ' . $url);
        }
    }


    $this->output->set_header('Access-Control-Allow-Headers: X-Requested-With');
    $this->output->set_header('Access-Control-Allow-Credentials: true');
    $this->output->set_header("Access-Control-Expose-Headers: Access-Control-Allow-Origin");


    //TODO: Try to detect if this is an ajax request, and disallow it if not.

    $data = new stdClass();
    $this->load->library("ion_auth");
    if($this->ion_auth->logged_in())
    {
        $data->name = $this->ion_auth->user()->row()->first_name;
        $data->id = $this->ion_auth->get_user_id();
    } else {
        $data->id = false;
    }

    $this->output->set_output(json_encode($data));

}

提前致谢

6 个答案:

答案 0 :(得分:18)

将“跨域访问数据源”的设置更改为“已启用”会关闭IE中的跨域检查,并且非常不安全。相反,您需要确保目标第三方资源发送valid P3P policy,表明它没有对用户的隐私做出可怕的事情。

答案 1 :(得分:13)

发现了这个问题。

  

我遇到了类似的问题(一般使用CORS,而不是GWT)。   原来,浏览器设置阻止了第三方   cookies(IE10> Internet选项>隐私>高级>第三方   饼干>接受)。为了解决这个问题,我检查了“覆盖自动   cookie处理“,”接受“(第三方Cookie)和”始终允许   会话cookie。“

Andrew在这里回答了这个问题:CORS doesn't work with cookies in IE10

编辑:(现在我知道要搜索什么)如果有其他人遇到这个问题,这个问题也可能会产生一些帮助。 Internet Explorer 10 is ignoring XMLHttpRequest 'xhr.withCredentials = true'

答案 2 :(得分:3)

我们遇到的问题是,除其他浏览器之外,IE11随请求一起发送Access-Control-Request-Headers: accept,因此“ accept”必须添加到allowedHeaders cors配置中,因为它似乎不是默认设置的一部分弹簧cors配置。

答案 3 :(得分:0)

IE10要求服务器返回有效的P3P策略以及跨域请求的CORS头。以下是从服务器返回P3P标头的示例php代码。

  $szOrigin = $_SERVER['HTTP_ORIGIN'];
  if ($szOrigin != null)
  {
        header("Access-Control-Allow-Origin: $szOrigin");
        header("Access-Control-Allow-Credentials: true");
        header("P3P: CP=\"ALL IND DSP COR ADM CONo CUR CUSo IVAo IVDo PSA PSD TAI TELo OUR SAMo CNT COM INT NAV ONL PHY PRE PUR UNI\"");
  }

答案 4 :(得分:0)

经过大量挖掘后,我发现我使用ajax ping的页面位于Internet区域,而我当前的页面位于Intranet区域。

IE 11具有"保护模式"已启用互联网网站,当启用此功能时,即使Cookie属于该域,也不会将Cookie发送到我正在ping的网站。

将页面添加到受信任的站点,或禁用"保护模式"解决了这个问题。

请注意,即使在"保护模式下,当两个站点都在Internet区域时,也不会发生此问题。已启用。

答案 5 :(得分:0)

我遇到了类似的问题,发现axios或jquery都无法与Internet Explorer和印前检查/ CORS问题一起使用。只有好的旧XMLhttpRequest起作用。因为在纯XMLhttpRequest中我们可以做到这一点:

if (xhttp.readyState == 4 && xhttp.status == 200)

似乎axios和jquery考虑了状态,而不是readyreadState-他们以某种方式解释存在cors问题-并需要花费一些时间才能在IE中达到readyState == 4。