Проверьте, включены ли файлы cookie


Я работаю на странице, которая требует javascript и сессий. У меня уже есть код, чтобы предупредить пользователя, если JavaScript отключен. Теперь я хочу обработать случай, когда куки отключены, так как идентификатор сеанса хранится в куки.

Я придумал всего пару идей:

  1. включение идентификатора сессии в ссылки и формы
  2. предупредите пользователя, что они должны включить куки, если они отключены (потребуется помощь в обнаружении, если куки отключено)

каков наилучший способ подойти к этому? Спасибо

EDIT

на основе статей, связанных, я придумал свой собственный подход и думал, что я хотел бы поделиться, кто-то еще может быть в состоянии использовать его, может быть, я получу несколько критических замечаний. (Предполагается, что ваш сеанс PHP хранится в файле cookie с именем PHPSESSID)

<div id="form" style="display:none">Content goes here</div>
<noscript>Sorry, but Javascript is required</noscript>
<script type="text/javascript"><!--
if(document.cookie.indexOf('PHPSESSID')!=-1)
   document.getElementById('form').style.display='';
else
   document.write('<p>Sorry, but cookies must be enabled</p>');
--></script>
9 59

9 ответов:

JavaScript

в JavaScript вы простой тест для cookieEnabled свойство, которое поддерживается во всех основных браузерах. Если вы имеете дело со старым браузером, вы можете установить куки и проверить, существует ли он. (заимствовано из модернизатор):

if (navigator.cookieEnabled) return true;

// set and read cookie
document.cookie = "cookietest=1";
var ret = document.cookie.indexOf("cookietest=") != -1;

// delete cookie
document.cookie = "cookietest=1; expires=Thu, 01-Jan-1970 00:00:01 GMT";

return ret;

PHP

в PHP это довольно "сложно", так как вам нужно обновить страницу или перенаправить на другой скрипт. Здесь я буду использовать два скрипта:

somescript.php

<?php
session_start();
setcookie('foo', 'bar', time()+3600);
header("location: check.php");

проверка.php

<?php echo (isset($_COOKIE['foo']) && $_COOKIE['foo']=='bar') ? 'enabled' : 'disabled';

но чтобы проверить, включены ли файлы cookie с помощью isset ($_COOKIE["cookie"]), вам нужно обновить. Я делаю это таким образом (с сеансами на основе cookies:)

session_start();
$a = session_id();
session_destroy();

session_start();
$b = session_id();
session_destroy();

if ($a == $b)
    echo"Cookies ON";
else
    echo"Cookies OFF";

прозрачный, чистый и простой подход, проверка доступности куки с PHP и воспользовавшись AJAX прозрачное перенаправление, следовательно не вызывает перезагрузку страницы. Он также не требует сеансов.

клиентский код (JavaScript)

function showCookiesMessage(cookiesEnabled) {
    if (cookiesEnabled == 'true')
        alert('Cookies enabled');
    else
        alert('Cookies disabled');
}

$(document).ready(function() {
    var jqxhr = $.get('/cookiesEnabled.php');
    jqxhr.done(showCookiesMessage);
});

(вызов jQuery AJAX может быть заменен чистым вызовом JavaScript AJAX)

код на стороне сервера (PHP)

if (isset($_COOKIE['cookieCheck'])) {
    echo 'true';
} else {
    if (isset($_GET['reload'])) {
        echo 'false';
    } else {
        setcookie('cookieCheck', '1', time() + 60);
        header('Location: ' . $_SERVER['PHP_SELF'] . '?reload');
        exit();
    }
}

при первом вызове скрипта файл cookie устанавливается, и скрипт сообщает браузеру перенаправить его на себя. Браузер делает это прозрачно. перезагрузка страницы не происходит, потому что это делается в области вызова AJAX.

во второй раз, когда вызывается перенаправление, если файл cookie получен, скрипт отвечает HTTP 200 (со строкой "true"), следовательно,showCookiesMessage вызывается функция.

если скрипт вызывается во второй раз (идентифицированный параметром "reload") и cookie не получен, он отвечает HTTP 200 строкой "false" - и showCookiesMessage функция вызывается.

вы не можете в том же наборе загрузки страницы и проверить, если куки установлен вы должны выполнить перезагрузку страницы:

  • PHP работает на сервере;
  • cookies на клиенте.
  • cookies отправляются на сервер только во время загрузки страницы.
  • только что созданные куки еще не были отправлены на сервер и будут отправлены только при следующей загрузке страницы.

JavaScript

вы можете создать файл cookie с помощью JavaScript и проверить, существует ли он:

//Set a Cookie`
document.cookie="testcookie"`

//Check if cookie exists`
cookiesEnabled=(document.cookie.indexOf("testcookie")!=-1)? true : false`

или вы могли бы использовать jQuery Cookie плагин

//Set a Cookie`
$.cookie("testcookie", "testvalue")

//Check if cookie exists`
cookiesEnabled=( $.cookie("testcookie") ) ? true : false`

Php

setcookie("testcookie", "testvalue");

if( isset( $_COOKIE['testcookie'] ) ) {

}

не уверен, что Php будет работать, поскольку я не могу его проверить.

Вы можете сделать вызов Ajax (Примечание: это решение требует JQuery):

пример.php

<?php
    setcookie('CookieEnabledTest', 'check', time()+3600);
?>

<script type="text/javascript">

    CookieCheck();

    function CookieCheck()
    {
        $.post
        (
            'ajax.php',
            {
                cmd: 'cookieCheck'
            },
            function (returned_data, status)
            {
                if (status === "success")
                {
                    if (returned_data === "enabled")
                    {
                        alert ("Cookies are activated.");
                    }
                    else
                    {
                        alert ("Cookies are not activated.");
                    }
                }
            }
        );
    }
</script>

ajax.php

$cmd = filter_input(INPUT_POST, "cmd");

if ( isset( $cmd ) && $cmd == "cookieCheck" )
{
    echo (isset($_COOKIE['CookieEnabledTest']) && $_COOKIE['CookieEnabledTest']=='check') ? 'enabled' : 'disabled';
}

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

легко определить, включены ли куки:

  1. установить cookie.
  2. сделать печенье

Если вы можете получить куки вы установили, то cookie включен, в противном случае нет.

кстати: это плохая идея Embedding the session id in the links and forms, это плохо для SEO. На мой взгляд, это не очень распространенная что люди не хотят включить cookies.

вот очень полезный и легкий плагин javascript для достижения этой цели:Яш-печенье

Cookies.set('cookieName', 'Value');
      setTimeout(function(){
        var cookieValue =  Cookies.get('cookieName');
        if(cookieValue){
           console.log("Test Cookie is set!");
        } else {
           document.write('<p>Sorry, but cookies must be enabled</p>');
        }
        Cookies.remove('cookieName');
      }, 1000);

работает во всех браузерах, можно любого персонажа.

Cookies являются клиентскими и не могут быть протестированы должным образом с помощью PHP. Это базовая линия, и каждое решение является оберткой для этой проблемы.

Это означает, что если вы ищете решение для своей проблемы с cookie, вы находитесь на неправильном пути. Не'й использовать PHP, использование клиентского языка JavaScript.

вы можете использовать куки с помощью PHP? Да, но вы должны перезагрузить, чтобы сделать настройки PHP "видимыми".

например: можно ли проверить, работает ли браузер можно установить куки с простым PHP'. Единственный правильный ответ - "нет".

можете ли вы прочитать уже установленный Cookie: 'YES' используйте предопределенный $_COOKIE (копия настроек перед запуском PHP-приложения).