跨域Cookie

我在两个不同的域中有两个WebApps WebApp1和WebApp2。

  1. 我在HttpResponse的WebApp1中设置一个cookie。
  2. 如何从WebApp2中的HttpRequest中读取相同的cookie?

我知道这听起来很奇怪,因为cookie是特定于给定域的,我们不能从不同的域访问它们; 但是我听说过可以跨多个webapps共享的CROSS-DOMAIN cookie。 如何使用CROSS-DOM Cookie来实现这个要求?

注:我正在尝试这与J2EE webapps

正如其他人所说,你不能共享cookies,但你可以做这样的事情:

  1. 把所有的cookies集中在一个域中,比方说cookiemaker.com
  2. 当用户向example.com发出请求时,您将他redirect到cookiemaker.com
  3. cookiemaker.com将他redirect到example.com,提供您所需的信息

当然,这不是完全安全的,你必须在你的应用程序之间创build一些内部协议来做到这一点。

最后,如果你在每个请求中做了这样的事情,那么对用户来说是非常烦人的,但是如果这只是第一个请求而不是这样。

但是我觉得没有别的办法

是的,通过domain2.com从domain1.com获取cookie是完全可能的,对于我社交networking的社交插件,我完全是一样的问题,经过一天的研究,我发现了解决scheme。

首先在服务器端你需要有这些头文件:

header("Access-Control-Allow-Origin: http://origin.domain:port"); header("Access-Control-Allow-Credentials: true"); header("Access-Control-Allow-Methods: GET, POST"); header("Access-Control-Allow-Headers: Content-Type, *"); 

有了php文件,你可以使用$ _COOKIE [name];

在客户端:

用你的ajax请求你需要包含2个参数

 crossDomain: true xhrFields: { withCredentials: true } 

例:

 type: "get", url: link, crossDomain: true, dataType: 'json', xhrFields: { withCredentials: true } 

据我所知,Cookie受到“同源”政策的限制。 但是,使用CORS,您可以接收并使用“服务器B”Cookie从“服务器B”上的“服务器A”build立持久会话。

虽然,这需要在“服务器B”上的一些标题:

 Access-Control-Allow-Origin: http://server-a.domain.com Access-Control-Allow-Credentials: true 

您需要在所有“服务器A”请求上发送“ withCredentials ”标志(例如: xhr.withCredentials = true;

你可以在这里阅读:

http://www.html5rocks.com/en/tutorials/cors/

https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS

没有跨域cookies这样的事情。 你可以在foo.example.combar.example.com之间共享一个cookie,但是从来没有在example.comexample2.com之间共享一个cookie,这是出于安全原因。

你不能跨域共享cookie。 但是,您可以允许所有子域名拥有访问权限。 要允许example.com所有子域都有权访问,请将域设置为.example.com

尽pipe给otherexample.com访问example.com的cookie是不可能的。

做Google做的事情。 创build一个PHP文件,在所有3个域上设置cookie。 然后在要设置主题的域上创build一个HTML文件,该文件将加载在另外两个域上设置cookie的PHP文件。 例:

 <html> <head></head> <body> <p>Please wait.....</p> <img src="http://domain2.com/setcookie.php?theme=whateveryourthemehere" /> <img src="http://domain3.com/setcookie.php?theme=whateveryourthemehere" /> </body> </html> 

然后在body标签上添加一个onloadcallback。 该文件只会在图像完全加载时加载,即在另外两个域上设置cookie时。 负载callback:

 <head> <script> function loadComplete(){ window.location="http://domain1.com";//URL of domain1 } </script> </head> <body onload="loadComplete()"> setcookie.php 

我们使用这样的PHP文件在其他域上设置cookie:

 <?php if(isset($_GET['theme'])){ setcookie("theme", $_GET['theme'], time()+3600); } ?> 

现在cookie被设置在三个域中。

您可以尝试使用图片标记将Cookie Cookie推送到另一个域。

尝试这样做时,您的里程可能会有所不同,因为某些浏览器要求您在WebApp2域上拥有适当的P3P策略 ,否则浏览器将拒绝Cookie。

如果您查看plus.google.com p3p政策,您会看到他们的政策是:

CP =“这不是P3P政策!请参阅http://www.google.com/support/accounts/bin/answer.py?hl=zh_CN&answer=151657获取更多信息。”;

那就是他们为这些跨域请求使用+1button的策略。

另一个警告是,如果你在https上,请确保图像标签指向一个https地址,否则cookie不会设置。

有一个关于Facebook如何在nfriedly.com这里做一个体面的概述

还有浏览器指纹识别(Browser Fingerprinting),它与cookie不一样,但是具有相似的目的,因为它可以帮助您确定一个用户的确定性。 这里有一个关于堆栈溢出的post,指出了一种指纹识别方法

 function GetOrder(status, filter) { var isValid = true; //isValidGuid(customerId); if (isValid) { var refundhtmlstr = ''; //varsURL = ApiPath + '/api/Orders/Customer/' + customerId + '?status=' + status + '&filter=' + filter; varsURL = ApiPath + '/api/Orders/Customer?status=' + status + '&filter=' + filter; $.ajax({ type: "GET", //url: ApiPath + '/api/Orders/Customer/' + customerId + '?status=' + status + '&filter=' + filter, url: ApiPath + '/api/Orders/Customer?status=' + status + '&filter=' + filter, dataType: "json", crossDomain: true, xhrFields: { withCredentials: true }, success: function (data) { var htmlStr = ''; if (data == null || data.Count === 0) { htmlStr = '<div class="card"><div class="card-header">Bu kriterlere uygun sipariş bulunamadı.</div></div>'; } else { $('#ReturnPolicyBtnUrl').attr('href', data.ReturnPolicyBtnUrl); var groupedData = data.OrderDto.sort(function (x, y) { return new Date(y.OrderDate) - new Date(x.OrderDate); }); groupedData = _.groupBy(data.OrderDto, function (d) { return toMonthStr(d.OrderDate) }); localStorage['orderData'] = JSON.stringify(data.OrderDto); $.each(groupedData, function (key, val) { var sortedData = groupedData[key].sort(function (x, y) { return new Date(y.OrderDate) - new Date(x.OrderDate); }); htmlStr += '<div class="card-header">' + key + '</div>'; $.each(sortedData, function (keyitem, valitem) { //Date Convertions if (valitem.StatusDesc != null) { valitem.StatusDesc = valitem.StatusDesc; } var date = valitem.OrderDate; date = date.substring(0, 10).split('-'); date = date[2] + '.' + date[1] + '.' + date[0]; htmlStr += '<div class="col-lg-12 col-md-12 col-xs-12 col-sm-12 card-item clearfix ">' + //'<div class="card-item-head"><span class="order-head">Sipariş No: <a href="ViewOrderDetails.html?CustomerId=' + customerId + '&OrderNo=' + valitem.OrderNumber + '" >' + valitem.OrderNumber + '</a></span><span class="order-date">' + date + '</span></div>' + '<div class="card-item-head"><span class="order-head">Sipariş No: <a href="ViewOrderDetails.html?OrderNo=' + valitem.OrderNumber + '" >' + valitem.OrderNumber + '</a></span><span class="order-date">' + date + '</span></div>' + '<div class="card-item-head-desc">' + valitem.StatusDesc + '</div>' + '<div class="card-item-body">' + '<div class="slider responsive">'; var i = 0; $.each(valitem.ItemList, function (keylineitem, vallineitem) { var imageUrl = vallineitem.ProductImageUrl.replace('{size}', 200); htmlStr += '<div><img src="' + imageUrl + '" alt="' + vallineitem.ProductName + '"><span class="img-desc">' + ProductNameStr(vallineitem.ProductName) + '</span></div>'; i++; }); htmlStr += '</div>' + '</div>' + '</div>'; }); }); $.each(data.OrderDto, function (key, value) { if (value.IsSAPMigrationflag === true) { refundhtmlstr = '<div class="notify-reason"><span class="note"><B>Notification : </B> Geçmiş siparişleriniz yükleniyor. Lütfen kısa bir süre sonra tekrar kontrol ediniz. Teşekkürler. </span></div>'; } }); } $('#orders').html(htmlStr); $("#notification").html(refundhtmlstr); ApplySlide(); }, error: function () { console.log("System Failure"); } }); } } 

Web.config文件

包括UI原点并将“允许创build”设置为true

 <httpProtocol> <customHeaders> <add name="Access-Control-Allow-Origin" value="http://burada.com" /> <add name="Access-Control-Allow-Headers" value="Content-Type" /> <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" /> <add name="Access-Control-Allow-Credentials" value="true" /> </customHeaders> </httpProtocol> 

Web Api读取Cookie

 var cookie = actionContext.Request.Headers.GetCookies("newhbsslv1"); Logger.Log("Cookie " + cookie, LoggerLevel.Info); Logger.Log("Cookie count " + cookie.Count, LoggerLevel.Info); if (cookie != null && cookie.Count > 0) { Logger.Log("Befor For " , LoggerLevel.Info); foreach (var perCookie in cookie[0].Cookies) { Logger.Log("perCookie " + perCookie, LoggerLevel.Info); if (perCookie.Name == "newhbsslv1") { strToken = perCookie.Value; } } } 

可以使用隐形iframe来获取cookie。 假设有两个域,a.com和b.com。 对于域名a.com的index.html,可以添加(注意height = 0 width = 0):

 <iframe height="0" id="iframe" src="http://b.com" width="0"></iframe> 

这样你的网站会得到b.com的cookies,假设http://b.com设置cookies。;

接下来的事情就是通过JavaScript操作iframe中的网站。 iframe中的操作可能会成为一个挑战,如果一个人不拥有第二个域名。 但是,如果能够访问这两个域名,在iframe的src处引用正确的网页,应该给出所希望的cookie。