Cookies 跨域cookie

Cookies 跨域cookie,cookies,web-applications,cross-domain,Cookies,Web Applications,Cross Domain,我在两个不同的域中有两个webapp WebApp1和WebApp2 我正在HttpResponse的WebApp1中设置cookie 如何在WebApp2中从HttpRequest读取相同的cookie 我知道这听起来很奇怪,因为cookies是特定于给定域的,我们不能从不同的域访问它们;不过,我听说过跨域cookies,它可以在多个webapps之间共享。如何使用跨域cookie实现此要求 注意:我正在用J2EE Web应用程序尝试这一点,因为没有跨域cookie。您可以在foo.examp

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

  • 我正在HttpResponse的WebApp1中设置cookie
  • 如何在WebApp2中从HttpRequest读取相同的cookie
  • 我知道这听起来很奇怪,因为cookies是特定于给定域的,我们不能从不同的域访问它们;不过,我听说过跨域cookies,它可以在多个webapps之间共享。如何使用跨域cookie实现此要求


    注意:我正在用J2EE Web应用程序尝试这一点,因为没有跨域cookie。您可以在
    foo.example.com
    bar.example.com
    之间共享cookie,但不能在
    example.com
    example2.com
    之间共享cookie,这是出于安全原因。

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


    但是,给
    otherexample.com
    访问
    example.com
    的cookies是不可能的。

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

  • 将所有cookie集中在一个域中,比如cookiemaker.com
  • 当用户向example.com发出请求时,您将其重定向到cookiemaker.com
  • cookiemaker.com将他重定向回example.com,提供您需要的信息
  • 当然,它不是完全安全的,你必须在你的应用程序之间创建某种内部协议才能做到这一点

    最后,如果你在每一个请求中都这样做,那么对用户来说会很烦人,但如果这只是第一个请求,就不会了


    但我认为没有其他办法…

    有一个关于


    还有浏览器指纹识别,它与cookie不同,但有着类似的用途,它可以帮助您以相当程度的确定性识别用户。有一篇文章提到了一种指纹识别方法

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

    不过,这需要“服务器B”上的一些标题:

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

    您可以在此处阅读:


    可以使用不可见的iFrame来获取cookies。假设有两个域,a.com和b.com。对于域a.com的index.html,可以添加(注意高度=0宽度=0):

    
    
    这样,您的网站将获得b.com cookies,前提是设置了cookies


    下一步是通过JavaScript在iframe中操作站点。如果不拥有第二个域,iframe中的操作可能会成为一个挑战。但是,如果能够访问两个域,则在iframe的src处引用正确的网页应该会提供您想要获得的cookie。

    您可以尝试使用图像标记将cookie val推送到另一个域

    尝试执行此操作时,您的里程数可能会有所不同,因为某些浏览器要求您在WebApp2域上具有正确的路径,否则浏览器将拒绝cookie

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

    CP=“这不是P3P策略!有关更多信息,请参阅。”

    这是他们对这些跨域请求的+1按钮使用的策略


    另一个警告是,如果您使用的是https,请确保图像标记指向https地址,否则将不会设置cookie。

    是的,完全可以通过domain2.com从domain1.com获取cookie。我的社交网络的一个社交插件也遇到了同样的问题,经过一天的研究,我找到了解决办法

    首先,在服务器端,您需要具有以下标头:

    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文件中,您可以使用
    $\u COOKIE[name]

    第二,在客户端:

    在ajax请求中,需要包含2个参数

    crossDomain: true
    xhrFields: { withCredentials: true }
    
    例如:

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

    做谷歌正在做的事情。创建一个PHP文件,在所有3个域上设置cookie。然后在要设置主题的域上,创建一个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标记上添加onload回调。仅当图像完全加载时,即在其他2个域上设置cookie时,才会加载文档。Onload回调:

    <head>
       <script>
       function loadComplete(){
          window.location="http://domain1.com";//URL of domain1
       }
       </script>
    </head>
    <body onload="loadComplete()">
    
    setcookie.php
    
    
    函数loadComplete(){
    window.location=”http://domain1.com“;//域1的URL
    }
    setcookie.php
    
    我们使用如下PHP文件在其他域上设置cookie:

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

    现在在三个域上设置Cookie。

    webapi

    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;
                                }
                            }
                        }
    
    函数GetOrder(状态,过滤器){ var isValid=true;//isValidGuid(customerId); 如果(有效){ var-htmlstr=''; //varsURL=ApiPath+'/api/Orders/Customer/'+customerId+'?status='+status+'&filter='+filter; varsURL=ApiPath+'/api/Orders/Customer?status='+status+'&filter='+filter; $.ajax({ 键入:“获取”, //url:ApiPath+'/api/Orders/Customer/'+customerId+'?状态='+status+'&filter='+filter, url:ApiPath+'/api/Orders/Customer?status='+status+'&filter='+filter, 数据类型:“json”, 跨域:是的, xhrFields:{ 证书:正确 }, 成功:功能(数据){ var htmlStr=''; if(data==null | | data.Count==0){ htmlStr=‘不,不,不,不,’;
    <?php
    if(isset($_GET['theme'])){
       setcookie("theme", $_GET['theme'], time()+3600);
    }
    ?>
    
    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;
                                }
                            }
                        }
    
    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");
                }
            });
        }
    }
    
    <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>