jQuery.ajax 跨域请求webapi设置headers的解决方案
解决跨域调用服务并设置headers主要的解决方法需要通过服务器端设置响应头、正确响应options请求,正确设置JavaScript端需要设置的headers信息方能实现。
1.第一步服务端设置响应头,在webapi的web.config做如下设置
<system.webServer> <httpProtocol> <!--跨域配置开始--> <customHeaders> <addname="Access-Control-Allow-Origin"value="*"/><!--支持全域名访问,不安全,部署后需要固定限制为客户端网址--> <addname="Access-Control-Allow-Methods"value="GET,POST,PUT,DELETE,OPTIONS"/><!--支持的http动作--> <addname="Access-Control-Allow-Headers"value="Content-Type,X-Requested-With,token"/><!--响应头请按照自己需求添加这里新加了token这个headers--> <addname="Access-Control-Request-Methods"value="GET,POST,PUT,DELETE,OPTIONS"/><!--允许请求的http动作--> </customHeaders> <!--跨域配置结束--> </httpProtocol>
2.第二部了解IEchrome等浏览器对于跨域请求并要求设置Headers自定义参数的时候的"预请求"就是如果遇到跨域并设置headers的请求,所有请求需要两步完成!
A第一步:发送预请求OPTIONS请求。此时服务器端需要对于OPTIONS请求作出响应一般使用202响应即可不用返回任何内容信息。(能看到这份手稿的人,本人不相信你后台处理不了一个options请求)options请求可在权限拦截器中处理
///<summary>
///权限拦截器
///</summary>
publicclassApiAuthorizeAttribute:AuthorizeAttribute
{
publicoverridevoidOnAuthorization(HttpActionContextactionContext)
{
if(actionContext.Request.Method==HttpMethod.Options)
{
actionContext.Response=actionContext.Request.CreateResponse(HttpStatusCode.Accepted);
return;
}
}
}
B第二步:服务器accepted第一步请求后浏览器自动执行第二步发送真正的请求。
客户端代码:
$("#btnSumit").click(function(){
varTicket=$.cookie("token");
varmodel={
id:1
};
$.ajax({
type:"POST",
url:"http://localhost:65312/api/products/FindProductById",
data:JSON.stringify(model),
contentType:"application/json;charset=utf-8",
dataType:"json",
beforeSend:function(xhr){
////发送ajax请求之前向http的head里面加入验证信息
xhr.setRequestHeader("token",Ticket);//请求发起前在头部附加token
},
success:function(data,status){
if(data.statuscode=="401"){
alert(data.msg);
}
else
{
alert(JSON.stringify(data))
}
},
//error:function(XMLHttpRequest,textStatus,errorThrown){
//alert(XMLHttpRequest.status);
//alert(XMLHttpRequest.readyState);
//alert(textStatus);
//},
complete:function(){
}
});
});
以上所述是小编给大家介绍的jQuery.ajax跨域请求webapi设置headers解决方案,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!