我正在处理一个需要javascript和会话的页面。如果javascript被禁用,我已经有了警告用户的代码。现在,我想处理禁用cookie的情况,因为会话id存储在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>
发布于 2012-04-30 18:15:51
但是要检查是否使用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";
发布于 2013-04-04 20:32:23
回答了一个老问题,这篇新帖子发布在2013年4月4日
为了完成@misza的回答,这里有一个高级方法,可以在不重新加载页面的情况下检查是否启用了cookie。@misza的问题是,当php ini设置session.use_cookies
不为真时,它并不总是有效。此外,该解决方案不会检查会话是否已经启动。
我制作了这个函数,并在不同的情况下对它进行了多次测试,工作做得很好。
function suGetClientCookiesEnabled() // Test if browser has cookies enabled
{
// Avoid overhead, if already tested, return it
if( defined( 'SU_CLIENT_COOKIES_ENABLED' ))
{ return SU_CLIENT_COOKIES_ENABLED; }
$bIni = ini_get( 'session.use_cookies' );
ini_set( 'session.use_cookies', 1 );
$a = session_id();
$bWasStarted = ( is_string( $a ) && strlen( $a ));
if( !$bWasStarted )
{
@session_start();
$a = session_id();
}
// Make a copy of current session data
$aSesDat = (isset( $_SESSION ))?$_SESSION:array();
// Now we destroy the session and we lost the data but not the session id
// when cookies are enabled. We restore the data later.
@session_destroy();
// Restart it
@session_start();
// Restore copy
$_SESSION = $aSesDat;
// If no cookies are enabled, the session differs from first session start
$b = session_id();
if( !$bWasStarted )
{ // If not was started, write data to the session container to avoid data loss
@session_write_close();
}
// When no cookies are enabled, $a and $b are not the same
$b = ($a === $b);
define( 'SU_CLIENT_COOKIES_ENABLED', $b );
if( !$bIni )
{ @ini_set( 'session.use_cookies', 0 ); }
//echo $b?'1':'0';
return $b;
}
用法:
if( suGetClientCookiesEnabled())
{ echo 'Cookies are enabled!'; }
else { echo 'Cookies are NOT enabled!'; }
重要说明:该函数在设置不正确时临时修改PHP的ini设置,在未启用时恢复。这只是为了测试是否启用了cookies。当你启动一个会话并且php ini设置session.use_cookies有一个不正确的值时,它可能会出错。要确保会话正常工作,请在启动会话之前进行检查和/或设置,例如:
if( suGetClientCookiesEnabled())
{
echo 'Cookies are enabled!';
ini_set( 'session.use_cookies', 1 );
echo 'Starting session';
@start_session();
}
else { echo 'Cookies are NOT enabled!'; }
发布于 2013-09-17 00:20:45
一种透明,干净和简单的方法,使用PHP检查cookies的可用性,并利用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);
});
(可以用纯JavaScript AJAX调用代替JQuery AJAX调用)
服务器端代码
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,脚本将响应HTTP200(字符串为"true"),因此将调用showCookiesMessage
函数。
如果第二次调用该脚本(由"reload“参数标识),并且没有收到cookie,则它将使用字符串"false”响应HTTP200,并调用showCookiesMessage
函数。
https://stackoverflow.com/questions/6663859
复制相似问题