Php 检查Cookie是否已启用
我正在处理一个需要javascript和会话的页面。如果禁用javascript,我已经有了警告用户的代码。现在,我想处理禁用cookie的情况,因为会话id存储在cookie中 我只想到了几个想法:Php 检查Cookie是否已启用,php,javascript,session-cookies,Php,Javascript,Session Cookies,我正在处理一个需要javascript和会话的页面。如果禁用javascript,我已经有了警告用户的代码。现在,我想处理禁用cookie的情况,因为会话id存储在cookie中 我只想到了几个想法: 在链接和表单中嵌入会话id 警告用户,如果禁用Cookie,则必须启用Cookie(如果禁用Cookie,则需要帮助检测) 最好的方法是什么?谢谢 编辑 根据链接的文章,我提出了我自己的方法,并认为我会分享,其他人可能会使用它,也许我会得到一些评论。(假设您的PHP会话存储在名为PHPSESSID
PHPSESSID
的cookie中)
内容在这里
抱歉,但是Javascript是必需的
JavaScript
在JavaScript中,您可以对该属性进行简单的测试,所有主要浏览器都支持该属性。如果您使用的是较旧的浏览器,则可以设置cookie并检查它是否存在。(借用自):
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创建cookie并检查它是否存在:
//Set a Cookie`
document.cookie="testcookie"`
//Check if cookie exists`
cookiesEnabled=(document.cookie.indexOf("testcookie")!=-1)? true : false`
或者你可以用一个
Php
setcookie("testcookie", "testvalue");
if( isset( $_COOKIE['testcookie'] ) ) {
}
<?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>
$cmd = filter_input(INPUT_POST, "cmd");
if ( isset( $cmd ) && $cmd == "cookieCheck" )
{
echo (isset($_COOKIE['CookieEnabledTest']) && $_COOKIE['CookieEnabledTest']=='check') ? 'enabled' : 'disabled';
}
不确定Php是否能工作,因为我无法测试它。很容易检测到cookie是否已启用:
放一块饼干
拿饼干
如果可以获取设置的cookie,则启用cookie
,否则不启用
顺便说一句:在链接和表单中嵌入会话id是个坏主意,这对SEO不利。
在我看来,人们不想启用COOKIE的情况并不常见。但要检查是否使用isset($\u COOKIE[“COOKIE”])启用了COOKIE,必须刷新。
我就是这样做的(基于cookies的会话:)
您不能在同一页面的加载集中检查是否设置了Cookie,您必须执行重新加载页面:
- PHP在服务器上运行李>
- 客户端的cookies
- 仅在加载页面期间发送到服务器的Cookie
- 刚刚创建的cookie尚未发送到服务器,将仅在下一次加载页面时发送
回答一个老问题,这篇新帖子发布于2013年4月4日
为了完成@misza的回答,这里有一个高级方法来检查cookie是否在不重新加载页面的情况下启用。@misza的问题在于,当php ini设置
session.use\u cookies
不正确时,@misza并不总是起作用。此外,解决方案不会检查会话是否已启动
我制作了这个函数,并在不同的情况下对它进行了多次测试,并且做得很好
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设置,并在未启用时恢复该设置。这仅用于测试Cookie是否已启用。当您启动会话并且php ini设置会话时,它可能会出错。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!'; }
一种透明、干净、简单的方法,使用PHP检查cookie可用性,并利用AJAX透明重定向,因此不会触发页面重新加载。它也不需要会话
客户端代码(JavaScript)
(JQuery AJAX调用可以替换为纯JavaScript AJAX调用)
服务器端代码(PHP)
第一次调用脚本时,会设置cookie,脚本会告诉浏览器重定向到自身。浏览器可以透明地执行此操作。不会重新加载页面,因为它是在AJAX调用范围内完成的
第二次,通过重定向调用时,如果收到cookie,脚本将响应HTTP 200(字符串为“true”),因此调用showCookiesMessage
函数
如果第二次调用脚本(由“reload”参数标识),但未收到cookie,它将用字符串“false”响应HTTP 200,并调用showCookiesMessage
函数。这里有一个非常有用的轻量级javascript插件来完成此任务:
Cookies.set('cookieName','Value');
setTimeout(函数(){
var cookieValue=Cookies.get('cookieName');
if(cookieValue){
log(“设置了测试Cookie!”);
}否则{
document.write(“抱歉,但必须启用cookies”);
}
Cookies.remove('cookieName');
}, 1000);
适用于所有浏览器,可接受任何字符。您可以进行Ajax调用(注意:此解决方案需要JQuery):
example.php
setcookie("testcookie", "testvalue");
if( isset( $_COOKIE['testcookie'] ) ) {
}
<?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>
$cmd = filter_input(INPUT_POST, "cmd");
if ( isset( $cmd ) && $cmd == "cookieCheck" )
{
echo (isset($_COOKIE['CookieEnabledTest']) && $_COOKIE['CookieEnabledTest']=='check') ? 'enabled' : 'disabled';
}
结果会出现一个警报框,显示cookie是否已启用。当然,您不必显示警报框,从这里您可以采取其他步骤来处理停用的Cookie。Cookie是客户端,无法使用PHP进行正确测试。
这是基线,每个解决方案都是这个问题的总结
这意味着如果你正在寻找解决你的饼干问题的方法,你就走错了路。不要使用PHP,使用Javascript之类的客户端语言
你能用PHP使用cookies吗?是的,但是必须重新加载才能使PHP的设置“可见”
例如:是否可以测试浏览器是否可以使用普通PHP设置cookie。唯一正确的答案是“不”
您是否可以读取已设置的Cookie:“是”使用预定义的$\u Cookie(启动PHP应用程序之前设置的副本)。在链接中嵌入会话id是可能的,但很麻烦。
function showCookiesMessage(cookiesEnabled) {
if (cookiesEnabled == 'true')
alert('Cookies enabled');
else
alert('Cookies disabled');
}
$(document).ready(function() {
var jqxhr = $.get('/cookiesEnabled.php');
jqxhr.done(showCookiesMessage);
});
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();
}
}
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);
<?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>
$cmd = filter_input(INPUT_POST, "cmd");
if ( isset( $cmd ) && $cmd == "cookieCheck" )
{
echo (isset($_COOKIE['CookieEnabledTest']) && $_COOKIE['CookieEnabledTest']=='check') ? 'enabled' : 'disabled';
}