Печенье с несколькими доменами

У меня есть два webapps WebApp1 и WebApp2 в двух разных доменах.

  • Я устанавливаю файл cookie в WebApp1 в HttpResponse.
  • Как прочитать тот же файл cookie из HttpRequest в WebApp2?

Я знаю, это звучит странно, потому что файлы cookie относятся к определенному домену, и мы не можем получить к ним доступ из разных доменов; Я, однако, слышал о CROSS-DOMAIN файлах cookie, которые могут быть переданы через несколько webapps. Как реализовать это требование с помощью cookie CROSS-DOMAIN?

Примечание. Я пытаюсь использовать это с помощью J2EE webapps

Ответ 1

Как говорят другие люди, вы не можете передавать файлы cookie, но вы можете сделать что-то вроде этого:

  • централизовать все файлы cookie в одном домене, скажем, cookiemaker.com
  • когда пользователь делает запрос на example.com, вы перенаправляете его на cookiemaker.com
  • cookiemaker.com перенаправляет его обратно на example.com с необходимой информацией.

Конечно, он не полностью защищен, и для этого вам нужно создать какой-то внутренний протокол между вашими приложениями.

Наконец, для пользователя было бы очень неприятно, если вы сделаете что-то подобное в каждом запросе, но не первый раз.

Но я думаю, что другого пути нет...

Ответ 2

Да, абсолютно возможно получить cookie из домена1.com по домену2.com, я был точно такой же проблемой для социального плагина моей социальной сети, и после дня исследования я нашел решение.

Сначала на стороне сервера вам нужно иметь эти заголовки:

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
}

Ответ 3

Насколько я знаю, файлы cookie ограничены политикой "того же происхождения". Однако с помощью CORS вы можете получать и использовать файлы cookie "Сервер B", чтобы установить постоянный сеанс с "сервера A" на "сервере B".

Хотя для этого нужны некоторые заголовки на "Server B":

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

И вам нужно будет отправить флаг " withCredentials" во всех запросах "Server A" (например: xhr.withCredentials = true;)

Вы можете прочитать об этом здесь:

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

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

Ответ 4

Нет таких вещей, как файлы cookie с перекрестными доменами. Вы можете делиться файлом cookie между foo.example.com и bar.example.com, но никогда между example.com и example2.com и по соображениям безопасности.

Ответ 5

Вы не можете передавать файлы cookie через домены. Однако вы можете разрешить доступ всем подобным доменам. Чтобы разрешить доступ всем субдоменам example.com, установите для домена значение .example.com.

Невозможно предоставить otherexample.com доступ к example.com файлам cookie, хотя.

Ответ 6

Сделайте то, что делает Google. Создайте файл PHP, который устанавливает cookie на всех 3 доменах. Затем в домене, где будет задана тема, создайте файл HTML, который будет загружать файл PHP, который устанавливает cookie на 2 доменах. Пример:

<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>

Затем добавьте обратный вызов onload для тега body. Документ загружается только при полной загрузке изображений, когда файлы cookie устанавливаются на других доменах 2. Onload Callback:

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

setcookie.php

Мы устанавливаем файлы cookie в других доменах, используя файл PHP, например:

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

Теперь файлы cookie устанавливаются на трех доменах.

Ответ 7

Вы можете попытаться нажать файл cookie в другой домен, используя тег изображения.

Ваш пробег может измениться при попытке сделать это, потому что некоторые браузеры требуют, чтобы у вас была правильная политика P3P в домене WebApp2, или браузер отклонит файл cookie.

Если вы посмотрите на политику plus.google.com p3p, вы увидите, что их политика:

CP = "Это не политика P3P! Подробнее см. http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657.

это политика, которую они используют для своих кнопок +1 для этих запросов на междоменные запросы.

Еще одно предупреждение: если вы используете https, убедитесь, что тег изображения указывает на адрес https, иначе cookie не будет установлен.

Ответ 8

Есть приличный обзор как Facebook делает это здесь, на nfriedly.com

Там также используется отпечаток пальца браузера, который не совпадает с файлом cookie, но служит аналогичной цели, поскольку он помогает вам идентифицировать пользователя с определенной степенью уверенности. Там есть сообщение здесь, в разделе Переполнение стека, которое ссылается на один метод отпечатки пальцев

Ответ 9

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

Включите источник пользовательского интерфейса и установите для параметра Allow Centials значение 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>

Ответ 10

Можно использовать невидимые фреймы для получения файлов cookie. Скажем, есть два домена: a.com и b.com. Для index.html домена a.com можно добавить (уведомление height = 0 width = 0):

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

Таким образом, ваш сайт получит куки b.com, предполагая, что http://b.com устанавливает файлы cookie.

Следующим шагом будет манипулирование сайтом внутри iframe с помощью JavaScript. Операции внутри iframe могут стать проблемой, если у вас нет второго домена. Но в случае доступа к обоим доменам, ссылающимся на правильную веб-страницу в src iframe, следует предоставить файлы cookie, которые вы хотели бы получить.

Ответ 11

Прочтите Cookie в Web Api

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;
                            }
                        }
                    }