检查是否启用了Cookie

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

我想到了一些想法:

  1. 将会话IDembedded到链接和表单中
  2. 警告用户,他们必须启用cookie,如果他们被禁用(需要帮助检测cookie是否被禁用)

什么是最好的方法来处理这个? 谢谢

编辑

根据这些文章,我提出了自己的方法,并认为我会分享,其他人可能会使用它,也许我会得到一些批评。 (假设您的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> 

JavaScript的

在JavaScript中,您可以简单地testingcookieEnabled属性,该属性在所有主stream浏览器中均受支持。 如果您处理旧版浏览器,则可以设置一个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; 
  • Modernizer cookie检查提交
  • 检查是否启用了Cookie

PHP

在PHP中,由于您必须刷新页面或redirect到另一个脚本,这相当“复杂”。 这里我将使用两个脚本:

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'; 
  • 检测是否使用PHP启用了Cookie
  • PHP和Cookies,一个好的组合!

但要检查是否使用isset($ _ COOKIE [“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检查cookie可用性,并利用AJAX透明redirect,因此不会触发页面重新加载 。 它也不需要会话。

客户端代码(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被设置,脚本告诉浏览器redirect到自己。 浏览器透明地执行。 没有页面重新加载,因为它是在一个AJAX调用范围内完成的

第二次,当被redirect调用时,如果接收到cookie,则脚本响应showCookiesMessage (带有string“true”),因此调用showCookiesMessage函数。

如果脚本第二次被调用(由“reload”参数标识),并且没有收到cookie,它会以string“false”响应HTTP 200,并调用showCookiesMessage函数。

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

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

JavaScript的

您可以使用JavaScript创build一个cookie并检查它是否存在:

 //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` 

 setcookie("testcookie", "testvalue"); if( isset( $_COOKIE['testcookie'] ) ) { } 

不知道如果Php将工作,因为我无法testing它。

您可以进行Ajax调用( 注意 :此解决scheme需要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'; } 

结果会出现一个警告框,显示cookies是否启用。 当然,你不必显示一个警告框,从这里你可以采取其他措施来处理停用的cookie。

很容易检测cookie是否启用:

  1. 设置一个cookie。
  2. 得到cookie

如果您可以获取您设置的cookie则启用cookie ,否则不启用。

顺便说一句:将会话Embedding the session id in the links and forms是一个坏主意,这对SEO不利。 在我看来,人们不希望启用cookies 并不常见

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

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

Cookie是客户端,不能使用PHP正确testing。 这是基准,每个解决scheme都是解决这个问题的方法。

这意味着如果你正在为你的cookie问题寻找一个解决scheme,你是错误的方式。 不要使用PHP,使用像Javascript这样的客户端语言。

你可以使用Cookie使用PHP? 是的,但是您必须重新加载才能使PHP的设置“可见”。

例如:testing是否可以查看浏览器是否可以使用纯PHP设置Cookie。 唯一正确的答案是“否”。

你可以阅读一个已经设置的Cookie:'YES'使用预定义的$ _COOKIE(启动PHP-App之前的设置副本)。