首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >检查cookies是否已启用

检查cookies是否已启用
EN

Stack Overflow用户
提问于 2011-07-12 20:02:35
回答 9查看 113.2K关注 0票数 81

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

我只想了几个想法:

  1. 在链接和表单中嵌入会话id
  2. 警告用户,如果cookies被禁用,则必须启用cookies (如果禁用cookies,则需要帮助检测cookies是否已禁用)

实现这一目标的最好方法是什么?谢谢

编辑

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

代码语言:javascript
复制
<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>
EN

回答 9

Stack Overflow用户

发布于 2012-04-30 18:15:51

但是要检查是否使用isset($_COOKIE"cookie")启用了cookie,您必须刷新。我是这样做的(基于cookie的会话:)

代码语言:javascript
复制
session_start();
$a = session_id();
session_destroy();

session_start();
$b = session_id();
session_destroy();

if ($a == $b)
    echo"Cookies ON";
else
    echo"Cookies OFF";
票数 17
EN

Stack Overflow用户

发布于 2013-04-04 20:32:23

回答了一个老问题,这篇新帖子发布在2013年4月4日

为了完成@misza的回答,这里有一个高级方法,可以在不重新加载页面的情况下检查是否启用了cookie。@misza的问题是,当php ini设置session.use_cookies不为真时,它并不总是有效。此外,该解决方案不会检查会话是否已经启动。

我制作了这个函数,并在不同的情况下对它进行了多次测试,工作做得很好。

代码语言:javascript
复制
    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;
    }

用法:

代码语言:javascript
复制
if( suGetClientCookiesEnabled())
 { echo 'Cookies are enabled!'; }
else { echo 'Cookies are NOT enabled!'; }

重要说明:该函数在设置不正确时临时修改PHP的ini设置,在未启用时恢复。这只是为了测试是否启用了cookies。当你启动一个会话并且php ini设置session.use_cookies有一个不正确的值时,它可能会出错。要确保会话正常工作,请在启动会话之前进行检查和/或设置,例如:

代码语言:javascript
复制
   if( suGetClientCookiesEnabled())
     { 
       echo 'Cookies are enabled!'; 
       ini_set( 'session.use_cookies', 1 ); 
       echo 'Starting session';
       @start_session(); 

     }
    else { echo 'Cookies are NOT enabled!'; }
票数 11
EN

Stack Overflow用户

发布于 2013-09-17 00:20:45

一种透明,干净和简单的方法,使用PHP检查cookies的可用性,并利用AJAX透明重定向,因此不会触发页面重载。它也不需要会话。

客户端代码(JavaScript)

代码语言: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调用)

服务器端代码

代码语言:javascript
复制
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函数。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6663859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档