检查cookie是否已启用

时间:2011-07-12 12:02:35

标签: php javascript session-cookies

我正在开发一个需要javascript和会话的页面。如果禁用了javascript,我已经有代码警告用户。现在,我想处理禁用cookie的情况,因为会话ID存储在cookie中。

我想到了几个想法:

  1. 在会话ID和表单中嵌入会话ID
  2. 警告用户必须启用Cookie(如果已禁用Cookie,则需要帮助检测Cookie是否已禁用)
  3. 最好的方法是什么?感谢

    修改

    根据链接的文章,我提出了自己的方法,并认为我会分享,其他人可能会使用它,也许我会得到一些批评。 (假设您的PHP会话存储在名为PHPSESSID)的cookie中

    <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 个答案:

答案 0 :(得分:70)

的JavaScript

在JavaScript中,您可以对所有主流浏览器都支持的cookieEnabled属性进行简单测试。如果您处理较旧的浏览器,则可以设置cookie并检查它是否存在。 (借鉴Modernizer):

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

答案 1 :(得分:17)

但要检查是否使用isset($ _ COOKIE [“cookie”])启用了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";

答案 2 :(得分:6)

您不能在同一页面的加载集中检查是否设置了cookie,您必须执行重新加载页面:

  • PHP在服务器上运行;
  • 客户端的cookie。
  • 仅在加载页面时发送到服务器的cookie。
  • 刚刚创建的Cookie尚未发送到服务器,只会在下次加载页面时发送。

答案 3 :(得分:6)

透明,干净且简单的方法,使用 PHP 检查Cookie可用性并利用 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,则它将使用字符串“false”响应HTTP 200,并调用showCookiesMessage函数。

答案 4 :(得分:2)

您可以进行Ajax调用(注意:此解决方案需要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。

答案 5 :(得分:1)

<强>的JavaScript

您可以使用JavaScript创建Cookie并检查它是否存在:

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

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

或者您可以使用jQuery Cookie plugin

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

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

<强>腓

setcookie("testcookie", "testvalue");

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

}

不确定Php是否会起作用,因为我无法测试它。

答案 6 :(得分:0)

很容易检测到Cookie是否已启用:

  1. 设置一个cookie。
  2. 获取cookie
  3. 如果你可以获得你设置的cookie,则启用cookie,否则启用。

    BTW:对Embedding the session id in the links and forms来说这是一个坏主意,对SEO来说是坏事。 在我看来,人们不想启用cookie 不常见

答案 7 :(得分:0)

这是一个非常有用且轻量级的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);

适用于所有浏览器,接受任何字符。

答案 8 :(得分:0)

Cookie是客户端的,无法使用PHP进行正确测试。 这是基线,每个解决方案都是这个问题的总结。

这意味着如果您正在寻找解决cookie问题的方法,那么您就错了。不要使用PHP,使用像Javascript这样的客户端语言。

您可以使用PHP使用Cookie吗?是的,但您必须重新加载以使设置为PHP&#39;可见&#39;。

例如:是否可以测试浏览器是否可以使用普通PHP设置Cookie&#39;。唯一正确的答案是&#39; NO&#39;。

你能读一个已经设置好的Cookie:&#39; YES&#39;使用预定义的$ _COOKIE(启动PHP-App之前的设置副本)。