Проверьте, включены ли куки - PullRequest
63 голосов
/ 12 июля 2011

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

Я подумала только о нескольких идеях:

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

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

РЕДАКТИРОВАТЬ

Основываясь на связанных статьях, я придумал свой собственный подход и подумал, что поделюсь, кто-то другой сможет его использовать, может быть, яполучит несколько критических замечаний.(Предполагается, что ваши сессии 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 ]

71 голосов
/ 12 июля 2011

JavaScript

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

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");

check.php

<?php echo (isset($_COOKIE['foo']) && $_COOKIE['foo']=='bar') ? 'enabled' : 'disabled';
17 голосов
/ 30 апреля 2012

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

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

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

if ($a == $b)
    echo"Cookies ON";
else
    echo"Cookies OFF";
6 голосов
/ 16 сентября 2013

Прозрачный, чистый и простой подход, проверка доступности файлов cookie с помощью 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 из чистого JavaScript)

Серверный код (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.

6 голосов
/ 20 ноября 2012

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

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

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

example.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';
}

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

1 голос
/ 12 июля 2011

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 будет работать, так как я не могу его протестировать.

0 голосов
/ 22 ноября 2016

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

То есть, если вы ищете решение для своей проблемы с cookie, вы на неправильном пути.Не используйте PHP, используйте клиентский язык, такой как Javascript.

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

Например: возможен ли тест, чтобы увидеть, может ли браузер устанавливать Cookies с простым PHP '?Единственный правильный ответ - «НЕТ».

Можете ли вы прочитать уже установленный Cookie: «YES» использует предопределенную $ _COOKIE (копию настроек до того, как вы запустили PHP-приложение).

0 голосов
/ 04 марта 2016

Вот очень полезный и легкий плагин javascript для этого: js-cookie

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

Работает во всех браузерах, принимает любой символ.

0 голосов
/ 12 июля 2011

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

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

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

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

...