嗨,老铁,欢迎来到我的博客!

如果觉得我的内容还不错的话,可以关注下我在 segmentfault.com 上的直播。我主要从事 PHP 和 Java 方面的开发,《深入 PHP 内核》作者之一。

[视频直播] PHP 进阶之路 - 亿级 pv 网站架构的技术细节与套路 直播中我将毫无保留的分享我这六年的全部工作经验和踩坑的故事,以及会穿插着一些面试中的 考点难点加分点

周梦康 发表于 2014-08-12 3308 次浏览 标签 : 计算机基础微笔记

最常见的场景就是从本地读取cookie来做自动登陆,大家有什么好的办法呢?先看看一个简单的例子(来源:http://www.ucai.cn/ask/detail?queid=3670):

define('SITE_USER_KE', 'ZCZsdf23E123SA');
function setUserCookie($uid)
{
    $key = SITE_USER_KE;
    $uk = $uid."_".md5($uid.$key);
    setcookie('uk', $uk, time()+86400*7, '/');
    return $uk;
}
 
function getUserCookie()
{
    if (isset($_COOKIE['uk']) and $_COOKIE['uk'])
    {
        $key = SITE_USER_KE;
        $uk = $_COOKIE['uk'];
        $arr = explode("_", $uk);
        $uid = $arr[0];
        if (md5($uid.$key) == $arr[1])
        {
            return $uid;
        }
    }
    return false;
}

再看看 ThinkSNS 的处理办法,大致思路一致。

登陆的时候存储cookie:

//cookie()是其封装好的一个函数
cookie('TSV3_LOGGED_USER', $this->jiami(C('SECURE_CODE').".{$uid}"), $expire);

之后登陆验证获取cookie中记录的用户ID

public function getCookieUid() {
	static $cookie_uid = null;
	if(isset($cookie_uid) && $cookie_uid !== null) {
		return $cookie_uid;
	}

	$cookie = cookie('TSV3_LOGGED_USER');
	
	$cookie = explode(".", $this->jiemi($cookie));

	$cookie_uid = ($cookie[0] != C('SECURE_CODE')) ? false : $cookie[1];
	
	return $cookie_uid;
}

这里是通过一个SECURE_CODE作为加密和解密的密钥

//这里的加密解密的算法我就不研究了,能力精力有限
private function jiami($txt, $key = null) {
	empty($key) && $key = C('SECURE_CODE');
	tsload(ADDON_PATH.'/library/DES_MOBILE.php');
    $desc = new DES_MOBILE();
    return $desc->setKey($key)->encrypt($txt);
}
private function jiemi($txt, $key = null) {
	empty($key) && $key = C('SECURE_CODE');
	tsload(ADDON_PATH.'/library/DES_MOBILE.php');
    $desc = new DES_MOBILE();
    return $desc->setKey($key)->decrypt($txt);
}

嗨,老铁,欢迎来到我的博客!

如果觉得我的内容还不错的话,可以关注下我在 segmentfault.com 上的直播。我主要从事 PHP 和 Java 方面的开发,《深入 PHP 内核》作者之一。

[视频直播] PHP 进阶之路 - 亿级 pv 网站架构的技术细节与套路 直播中我将毫无保留的分享我这六年的全部工作经验和踩坑的故事,以及会穿插着一些面试中的 考点难点加分点

评论列表