检查是否启用了Cookie
我在一个需要JavaScript和会话的页面上工作。 我已经有代码来警告用户,如果javascript被禁用。 现在,我想处理禁用cookie的情况,因为会话ID存储在cookie中。
我想到了一些想法:
- 将会话IDembedded到链接和表单中
- 警告用户,他们必须启用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是否启用:
- 设置一个cookie。
- 得到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之前的设置副本)。