我正努力通过IE11让CORS工作。
我必须使用jquery(或者使用本机浏览器支持的任何内容)发出ajax请求,不需要额外的库。这些请求是跨域的,它们可以在Chrome和Firefox中完美运行。
$.ajax(otherDomainConnectUrl, {
contentType: 'application/json',
dataType: 'json',
crossDomain: true,
success: (connectParams, textStatus, jqxhr) => {
console.log('Connect ok. Params: ', connectParams);
success(connectParams);
},
error: (jqxr, textStatus, errorThrown) => {
this.errorRenderer.renderError(connectionError);
console.log('jquery error results:', jqxr, textStatus, errorThrown);
}
});
在服务器端,我使用ASP.NET MVC和C#。我在控制器操作上使用自定义属性进行CORS检查:
[AllowCrossSiteJson]
public string Connect()
{
// ... logic logic...
var serializedMessage = JsonConvert.SerializeObject(databag, settings);
return serializedMessage;
}
CORS自定义属性具有以下逻辑。请注意我如何检索有效域列表,然后检查Referrer URL是否是这些域之一,然后选择接受/拒绝CORS请求:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var allowedDomains = ClientSpecificConfig.GetAllowedHostDomains();
if (filterContext?.RequestContext?.HttpContext?.Request?.UrlReferrer != null
&& allowedDomains.Contains(filterContext.RequestContext.HttpContext.Request.UrlReferrer.Host))
{
filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Origin", "*");
filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS");
filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
}
base.OnActionExecuting(filterContext);
}
所以我只为已知域添加了Access-Control-Allow-Origin:*。我不想在任何地方打开来自任何主机的电话。
问题是IE11根本不提供Referrer,因此我无法通过添加必要的标头来批准CORS检查。那么当脚本在IE11中运行时,如何检查源主机是否是有效主机?
答案 0 :(得分:0)
您可以使用jQuery添加自定义标头:
// Request with custom header
$.ajax({
headers: { 'x-cors-auth': window.location.href }
});
从这里,您可以将这些标头设置为您想要的任何值。由于IE不发送推荐人,您可以尝试实际设置推荐人头。
您还可以使用$.ajaxSetup
指定将在每次请求时发送的标头,或者您将在发送之前调用您使用的多个域:
$.ajaxSetup({
beforeSend: function(xhr) {
headers: { 'x-cors-auth': window.location.href }
}
});
答案 1 :(得分:0)
IE11不为跨域调用提供Referrer,但它确实提供了Origin头。
我用了这个。检查"有效"源域现在看起来如下:
render('http://localhost:8888/createForm.htmlusername='+username+'&pets='+pets+'&address='+address)
.pipe(fs.createWriteStream('customer.pdf'));