使用IE11的CORS请求

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

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

我正在使用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)); } 

提前致谢

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

发现了这个问题。

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

Andrew在这里回答了这个问题: CORS不适用于IE10中的cookie

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

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

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\""); } 

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

IE 11为互联网站点启用了“保护模式”,当启用此function时,即使cookie属于该域,也不会将cookie发送到我正在ping的站点。

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

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

我有类似的问题,发现axios或jquery都不能用于Internet Explorer和预检/ CORS问题。 只有好旧的XMLhttpRequest才有效。 因为在纯XMLhttpRequest中我们可以这样做:

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

似乎axios和jquery考虑了状态而不是readyState – 它们以某种方式解释存在cors问题 – 并且在IE中需要几个滴答来达到readyState == 4。