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

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

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

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

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

+146
источник поделиться
11 ответов

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

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

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

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

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

+85
источник

Да, абсолютно возможно получить 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
}
+63
источник
другие ответы

Связанные вопросы


Похожие вопросы

Насколько я знаю, файлы 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

+49
источник

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

+13
источник

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

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

+8
источник

Сделайте то, что делает 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 устанавливаются на трех доменах.

+8
источник

Вы можете попытаться нажать файл 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 не будет установлен.

+7
источник

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

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

+5
источник
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>
+1
источник

Можно использовать невидимые фреймы для получения файлов 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, которые вы хотели бы получить.

-1
источник

Прочтите 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;
                            }
                        }
                    }
-1
источник

Посмотрите другие вопросы по метке или Задайте вопрос