Проверьте, включены ли cookies
Я работаю над страницей, которая требует javascript и сеансов. У меня уже есть код, чтобы предупредить пользователя, если JavaScript отключен. Теперь я хочу обработать случай, когда cookies отключены, поскольку идентификатор сеанса хранится в cookies.
Я подумал только о нескольких идеях:
- включение идентификатора сессии в ссылки и формы
- предупредите пользователя, что они должны включить куки, если они отключены (потребуется помощь в обнаружении, если куки отключено)
каков наилучший способ подойти к этому? Спасибо
редактировать
основываясь на связанных статьях, я придумал свой собственный подход и подумал, что я поделюсь, кто-то еще может использовать его, может быть, я получу несколько критических замечаний. (Предполагается, что ваш сеанс 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 ответов
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");
проверка.в PHP
<?php echo (isset($_COOKIE['foo']) && $_COOKIE['foo']=='bar') ? 'enabled' : 'disabled';
но чтобы проверить, включены ли cookies с помощью isset($_COOKIE["cookie"]), вам нужно обновить. Im делает это так (с сеансами, основанными на 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 отправляются на сервер только во время загрузки страницы.
- только что созданные 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>
"Аякса".в PHP
$cmd = filter_input(INPUT_POST, "cmd");
if ( isset( $cmd ) && $cmd == "cookieCheck" )
{
echo (isset($_COOKIE['CookieEnabledTest']) && $_COOKIE['CookieEnabledTest']=='check') ? 'enabled' : 'disabled';
}
в результате появляется окно предупреждения, которое показывает, включены или нет куки-файлы. Конечно, вам не нужно показывать окно предупреждения, отсюда вы можете предпринять другие шаги для борьбы с деактивированными куки.
легко определить, включены ли cookies:
- установить cookie.
- получить cookie
Если вы можете сделать печенье, тем cookie
включено, в противном случае не.
BTW: это плохая идея 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.
вы можете использовать cookies с помощью PHP? Да, но вам нужно перезагрузить, чтобы сделать настройки PHP "видимыми".
например: возможен ли тест, чтобы увидеть, если браузер можно установить Cookies с помощью простого PHP'. Единственный правильный ответ - "нет".
можете ли вы прочитать уже установленный Cookie: "да" используйте предопределенную $_COOKIE (копию настроек перед запуском PHP-приложения).