繁体   English   中英

PHP cookie和会话问题

[英]PHP cookies and sessions problem

我该如何做一个使用Cookie进行登录的登录脚本,例如,我想检查访问者是否已登录而不查询数据库。

例如,我希望在首页上仅显示某些已登录用户的菜单。

所以我必须做if(isLoggedIn())显示菜单。 但这是每次页面加载时的查询,因此效果不是很好

有什么建议么?

你可以这样做:

session_start();

// Use $HTTP_SESSION_VARS with PHP 4.0.6 or less
if (!isset($_SESSION['loggedIn'])) {
  $_SESSION['loggedIn'] = true;

  // Add all the relevant user information data
  $_SESSION['username'] = $username;
  $_SESSION['password'] = $password;
  $_SESSION['etc'] = $etc;
}

然后,您可以将用户数据请求到$ _SESSION全局数组。 例如:询问用户是否已登录(不要忘记首先调用session_start()):

function isLoggedIn() {
    return (isset($_SESSION['loggedIn']) && $_SESSION['loggedIn']);
}

如果要注销:

session_destroy();

超时可以在php.ini文件中处理:

; After this number of seconds, stored data will be seen as 'garbage' and
; cleaned up by the garbage collection process.
session.gc_maxlifetime = 1440

或者,您可以在运行时使用ini_set处理ini变量:

ini_set('session.gc_maxlifetime', $sessionMaxLifeTime);

您可以使用函数setcookie来创建cookie,并使用此功能来检查loggedIn是否已设置且不是false。 :)

function isLoggedIn() {
    return (isset($_COOKIE['loggedIn']) && $_COOKIE['loggedIn']);
}

您可以为此使用php中的会话。 添加session_start(); 登录后,可能会针对数据库在会话中设置一个标志。

// user logged in sucessful
$_SESSION['logged_in'] = true;

比检查您的页面:

if (isset($_SESSION['logged_in']) && $_SESSION['logged_in'] === true) {
 // display menu item
}

登录后立即使用http://php.net/manual/zh-CN/function.setcookie.php设置标志,然后使用$ _COOKIES检查该标志。 或者,您可以将此标志设置为$ _SESSION,然后在此处进行检查。

PHP的$ _SESSION是基于文件的,因此如果您使用数据库,则不会对数据库造成任何影响(尽管数据库几乎总是比文件查找快,因此可能没有什么用处)。

您可以使用内存缓存,如memcached。

或者,为了降低安全性,您可以存储带有时间和哈希值的第二个cookie。 发出它时,您将当前时间与只有您的应用程序逻辑知道的秘密盐串起来,然后对其进行md5()或sha1()。 每次浏览时,您只需检查Cookie中的时间是否在最后一个小时内(或您配置的任何时间段)内,并且哈希有效。 它可能会被欺骗一个小时,并且您需要以其他方式检查合法会话,但仅基于菜单的内容就足够了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM