![](/img/trans.png)
[英]Submitting a form to a Rails server from jQuery using AJAX isn't working in IE11
[英]How do I implement CORS from IE11 using C# and JQuery.ajax?
我正在努力讓CORS通過IE11工作。
我必須使用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根本不提供Refererer,因此我無法通過添加必要的標頭來批准CORS檢查。 那么,當腳本在IE11中運行時,如何檢查源主機是否為有效主機?
您可以使用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 }
}
});
IE11不提供跨域調用的Referrer,但提供Origin頭。
我改用這個。 現在,對“有效”源域的檢查如下所示:
private static bool sourceDomainIsAllowed(ActionExecutingContext filterContext, List<string> allowedDomains)
{
var request = filterContext?.RequestContext?.HttpContext?.Request;
var referrerHost = request?.UrlReferrer?.Host;
var originKey = request?.Headers.AllKeys.FirstOrDefault(k => k.EqualsIgnoreCase("Origin"));
if (!string.IsNullOrWhiteSpace(referrerHost))
{
return allowedDomains.Contains(referrerHost);
}
else if (!string.IsNullOrWhiteSpace(originKey))
{
var origin = request.Headers[originKey];
var uri = new Uri(origin);
return allowedDomains.Contains(uri.Host);
}
return false;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.