Куки не могут быть установлены в IE? - PullRequest
5 голосов
/ 09 ноября 2011

У меня есть следующий код на website1.com:

<script type="text/javascript">
    document.cookie = "qwe=1";
    alert(document.cookie);
</script>

, а website2.com содержит:

<iframe src="http://website1.com"></iframe>

Когда я открываю страницу website2.com в IE, она выдает пустую строку (если куки не были установлены ранее).
Другие браузеры предупреждают "qwe = 1".

Итак, вопрос в том, почему и как обойти это?

Ответы [ 2 ]

5 голосов
/ 09 ноября 2011

Речь идет о безопасности в IE.

Если вы хотите разрешить доступ к файлам cookie в IFRAME, установите заголовок HTTP следующим образом:

ASP.NET:

HttpContext.Current.Response.AddHeader("p3p","CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\"");

JSP:

 response.addHeader("P3P","CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\"")

PHP:

header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"');
1 голос
/ 09 ноября 2011

Cookies устанавливаются с document.cookie, однако они не отправляются на сервер (и, следовательно, не имеют никакого эффекта) до следующей загрузки страницы.Я бы предположил, что стандартное поведение document.cookie состоит в том, чтобы имитировать это, а не обновлять значение чтения до следующей загрузки страницы (другими словами, установка document.cookie устанавливает cookie, но чтение document.cookie дает cookie, которые были отправлены вrequest).

IE9 исправил много проблем, присутствующих в старых версиях.И я имею в виду LOT .Это, скорее всего, один из них.Обходной путь, я полагаю, обрабатывает куки самостоятельно.Как и в PHP, у меня есть функция:

<?php
function setRealCookie( ... ) {
    setcookie( ... );
    $_COOKIE[...] = ...;
}
?>

В JavaScript вы можете создать объект, который отслеживает файлы cookie для вас, включая обновление самого себя, когда файл cookie установлен, и так далее.Что-то вроде:

(cookies = {
    data: {},
    init: function() {
        var c = document.cookie.split(";"), l = c.length, i, t;
        for( i=0; i<l; i++) {
            t = c[i].split("=");
            cookies.data[t.shift()] = t.join("=");
        }
    },
    read: function(key) {
        return cookies.data[key];
    },
    set: function(key,value) {
        document.cookie = key+"="+value;
        cookies.data[key] = value;
    }
}).init();

Затем вы можете установить cookie с помощью cookies.set("qwe","1"); и прочитать его обратно с помощью cookies.read("qwe");.

...