Я работаю над страницей, для которой требуются javascript и сеансы. У меня уже есть код для предупреждения пользователя, если javascript отключен. Теперь я хочу обработать случай, когда файлы cookie отключены, так как идентификатор сеанса хранится в файлах cookie.
Я подумал о нескольких идеях:
Каков наилучший способ приблизиться к этому? благодаря
РЕДАКТИРОВАТЬ
Основываясь на связанных статьях, я придумал свой собственный подход и думал, что поделюсь, кто-то другой сможет его использовать, может быть, я получу несколько критических замечаний. (Предположим, что ваши хранилища сеансов PHP PHPSESSID
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>
В 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 он довольно «сложный», поскольку вам нужно обновить страницу или перенаправить на другой скрипт. Здесь я буду использовать два сценария:
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';
Но чтобы проверить, разрешены ли 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";
Прозрачный, чистый и простой подход, проверка доступности файлов 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)
Серверный код (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
функция showCookiesMessage
.
Если сценарий вызывается во второй раз (идентифицируется параметром «перезагрузка»), и cookie не получен, он отвечает HTTP 200 с строкой «false», и showCookiesMessage
функцию showCookiesMessage
.
Вы не можете установить загрузку одной и той же страницы и проверить, установлены ли файлы cookie, вы должны выполнить страницу перезагрузки:
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 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-файлы cookie включены или нет. Конечно, вам не нужно показывать окно предупреждения, отсюда вы можете предпринять другие шаги для устранения деактивированных файлов cookie.
легко определить, разрешены ли файлы cookie:
если вы можете получить cookie, который вы установили, cookie
включен, иначе нет.
Кстати: это плохая идея для Embedding the session id in the links and forms
, это плохо для SEO. На мой взгляд, это не очень распространено, что люди не хотят включать файлы cookie.
Вот очень полезный и легкий плагин 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);
Работает во всех браузерах, принимает любого персонажа.
Куки-файлы на стороне клиента и не могут быть правильно протестированы с использованием PHP. Это базовая линия, и каждое решение – это обход для этой проблемы.
Если вы ищете решение проблемы с вашим файлом cookie, вы ошиблись. Не используйте PHP, используйте язык клиента, например Javascript.
Можете ли вы использовать файлы cookie с помощью PHP? Да, но вам нужно перезагрузить, чтобы сделать настройки на PHP «видимыми».
Например: можно ли проверить, может ли браузер установить Cookies с простым PHP? Единственный правильный ответ – «НЕТ».
Вы можете прочитать уже установленное Cookie: «YES» использовать предопределенный $ _COOKIE (копия настроек перед запуском PHP-приложения).