ASP中WebAPI和Ajax跨域数据交互时的Cookies数据传输 网
序
最近公司的项目进行了结构调整,从原来的三层结构升级为微服务结构(准确的说是服务不全,粒度没那么细),遵循RESTFull规范,前后端完全分离,实现了大前端的思路。因为是第一次尝试,中间遇到了很多问题。今天,我们来讨论其中一个问题。WebAPI与前端Ajax交互跨域数据时,由于Cookies数据在不同的二级域名下(一级域名相同),无法获取Cookies数据。
首先,通过Header将Cookies传输到它的WebAPI也可以解决这个问题。
另一种解决方案描述如下。
解决过程:
第一步:将Cookies的Domain设置为一级域名,如“. wbl.com”(a.wbl.com域名下)
这是前提。此时,在其中一个web API中设置了Cookies后,可以通过浏览器直接访问其他web API来获取Cookies。比如a.wbl.com域名下设置的Cookies,可以通过浏览器直接访问b.wbl.com域名的WebAPI获得。但是使用c.web.com域名下的Ajax访问b.wbl.com时,无法获取Cookies,这是由于浏览器中Ajax的权限相对较低,以及Ajax无法跨域的问题造成的。
编写Cookies代码:
///summary////为指定的Cookies赋值///summary//Param name=' cook key ' Cookie name/Param///Param name=' value ' Cookie value/Param///Param name=' domain '设置与此Cookies关联的域(如“tpy100.com”)(可由该域名下的二级域名访问)/Param public static void setCookie s value(string cook key,string value,string domain){ httpookie cookie=new HttpCookie(Cookie);饼干。价值=价值;饼干。HttpOnly=trueif(!字符串。IsNullOrEmpty(域)域。长度0) cookie。Domain=domainHttpContext。当前。响应。cookie。添加(cookie);}第二步:JQuery中的Ajax使用Jsonp数据类型解决跨域问题(c.wbl.com域名下)
前端和后端需要定义一个统一的回调函数名。
前端Ajax代码:
//set cookies函数集(){ var URL=' http://a.wbl.com/API/setvalue/88888'; $ '。ajax({ type: 'get ',url: url,dataType: 'jsonp ',jsonp: 'callbackparam ',//服务器用来接收回调调用的函数名的参数jsoncallback 3360 ' success _ jsoncallback ',//回调的函数名为success 3360 function(JSON){ console . log(JSON);alert(JSON);},error : function(){ alert(' fail ');} });}//get cookies函数get(){ var URL=' http://b.wbl.com/API/getvalue'; $。ajax({ type: 'get ',url: url,dataType: 'jsonp ',jsonp: 'callbackparam ',//服务器用来接收回调调用的函数名的参数jsoncallback 3360 ' success _ jsoncallback ',//回调的函数名为success 3360 function(JSON){ console . log(JSON);alert(JSON);},error : function(){ alert(' fail ');} });}第三步:在WebAPI中返回jsonp数据类型
Jsonp格式:
success _ jsoncallback({“Cookies”:“888888”})
由于这种格式不同于json格式,所以不可能在WebAPI中返回IHttpActionResult或HttpRequestMessage类型,最终通过流输出实现这种格式。
WebAPI代码:
[Route(' API/GetValue ')][httpGet]public void GetValue(){ string CCC=my Tools .请求。GetString('回调参数');var a=new { name='Cookies ',value=MyTools .饼干。getcookies value(' name ')};字符串结果=CCC '({ \ ' Cookies ' : \ '“我的工具.饼干。getcookies value(' name ')' \ ' })';//var响应=请求CreateResponse(HttpStatusCode .OK);//响应。内容=新字符串内容(结果,编码. UTF8);HttpContext .当前。响应。写入(结果);HttpContext .当前。响应。结束();//返回响应;}[Route(' API/SetValue/{ id } ')][HttpGet]public void SetValue(int id){//string domain=' ';string domain=。wbl。com”;我的工具饼干。ClearCookies(')名称,域);我的工具饼干。SetCookiesValue('name ',id .ToString(),域);字符串ccc=MyTools .请求。GetString('回调参数');字符串结果=ccc '({\ '结果' :\ '设置成功\'})';HttpContext .当前。响应。写入(结果);HttpContext .当前。响应。结束();}最终效果:
后言:
这只是解决这个问题的一种方法。百度后还有一种通过第三方插件(跨来源、帮助页面)来处理的,后续在进行实验。各位路过的大神如有更好的方法,望不要吝啬,请赐教!菜鸟感激不尽!
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持我们!
版权声明:ASP中WebAPI和Ajax跨域数据交互时的Cookies数据传输 网是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。