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解决方案,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!