Печенье с несколькими доменами
У меня есть два 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;
}
}
}