linux初探

首页

应用服务器

Linux技巧

中文文档

Linux初级

服务器源代码

命令详解

Linux技术应用

Linux安全应用

Linux业界新闻

UniX技术文章

Linux编程与内核

Linux数据库

Linux服务器

Linux安装指导

Linux论坛

首页>>Linux安全应用>>文章正文

Linux下Web服务基于数据库的会话管理


摘 要:本文讨论了Cookie技术和会话管理机制。采用RedHat7.2 Linux、Apache1.3.20和PostgreSQL7.1网络数据库实现了一个基于数据库会话管理的Web服务。

关键词:Web服务器 数据库 会话管理

1 Web服务中会话概念的产生

Cookie是Web服务器发送给Web浏览器的体积很小的纯文本信息,以文本文件的形式存放在用户的计算机中,这些Cookie一般用于保存用户的访问状态,当用户再次访问同一个网站时会将这些Cookie信息发送回服务器,使得服务器能够恢复用户上一次的访问状态。使用Cookie的根本目的是为了在用户访问期间实现不同页面之间的数据传输,以解决HTTP无状态的问题。Cookie技术能够增强网站的服务功能,为用户带来方便。但是Cookie还有许多限制和不足,如每台用户计算机一般只允许存放300个Cookie,同一个Web服务器只能发送20个Cookie等。

针对Cookie技术的局限性,美国微软公司首先提出了会话(Session)的概念[1],并将会话技术集成在ASP(动态服务器网页)语言中。会话是指用户访问Web服务器期间存放在Web服务器上的所有与用户访问状态有关的信息。每次新创建的会话都有一个唯一的标识串,称为会话ID,会话ID被保存在Web服务器中,其它会话信息都在会话ID的索引下进行保存和读取。一次会话从创建到被删除的时间称为会话生存期,会话生存期的长短由会话管理机制决定。Cookie与会话的不同之处在于:Cookie将用户访问的状态信息通过Web浏览器存放在用户计算机中,而会话通过会话管理机制存放在Web服务器中。

2 会话管理机制

会话的优势是它可以保存在Web服务器的内存、文件或数据库中,这样就有三种会话管理机制:基于内存的会话管理、基于文件的会话管理和基于数据库的会话管理。

基于内存的会话管理是运行速度最快的一种机制,它一般在Web服务器的内存中专门开辟一块共享内存区域,在这片内存区域中可直接快速地存取会话信息。这种机制对Web服务器的系统配置要求较高,需要系统资源能够负载较高的访问量,否则不仅不能提高访问速度,相反地还会因系统资源不足造成服务器负载过重。

基于文件的会话管理是使用最广泛的一种机制,会话信息一般以文本文件的形式存放在Web服务器的硬盘中。这种机制易于实现,对服务器的系统配置要求不高,但是存放会话信息的文件之间缺乏逻辑联系,当并发的访问量很大时会话管理的文件数目将增长很快,这不仅大大增加设计会话管理机制的难度,也会相应地影响存取会话信息的速度。

基于数据库的会话管理是最容易扩展的一种机制,它需要Web服务器有一个网络数据库系统支撑,会话信息全部存放在网络数据库中,在数据库系统的支持下会话管理可以充分利用数据库具有的事务处理、安全存取和数据完整性检验等机制,有效地管理所有的会话信息。会话信息在数据库中相互之间很容易建立起逻辑联系,设计出统一快速的存取方法。这种机制特别适用于访问量很大的大中型Web网站。

以上三种会话管理机制具有各自的特点和优势,其比较见表1:

表1 基于内存、文件和数据库的三种会话管理机制的比较

3 基于数据库的会话管理的实现

本文下面将给出用PHP语言实现的一个基于数据库的会话管理机制[2],这个会话管理机制采用RedHat7.2 Linux操作系统平台,Apache1.3.20 Web服务器程序,PostgreSQL7.0网络数据库。本机制可根据用户的需要进行修改和扩展,另外程序中使用了PHP语言的PEAR对象模块库,利用PEAR内的DB模块可实现数据库类型无关性操作[3],也就是说用户的网络数据库可选择Linux操作系统支持的其它数据库,如MySQL、Oracle、SyBase、Informix和MiniSQL等数据库。实现代码如下:

1.创建数据库和表

CREATE DATABASE sessionsCREATE TABLE sessions ( sesskey char(32) PRIMARY KEY,                          expiry int NOT NULL,                         alue text NOT NULL)

2.PHP语言实现的会话管理机制

<?phprequire_once("DB.php");$SESS_DBHOST = "localhost";    /*数据库服务器主机名*/$SESS_DBNAME = "sessions";     /* 数据库名 */$SESS_DBUSER = "kycman";       /* 数据库用户 */$SESS_DBPASS = "kycman";       /* 数据库口令 */$SESS_DBH = "";$SESS_LIFE = get_cfg_var("session.gc_maxlifetime");function sess_open($save_path, $session_name) {global $SESS_DBHOST, $SESS_DBNAME, $SESS_DBUSER, $SESS_DBPASS, $SESS_DBH;$dns="pgsql://$SESS_DBUSER:$SESS_DBPASS@$SESS_DBHOST/$SESS_DBNAME";$SESS_DBH=DB::connect($dns);        if (DB::isError($SESS_DBH)) {                die($SESS_DBH->getMessage());        }        return true;}function sess_close() {        $SESS_DBH->disconnect();        return true;}function sess_read($key) {        global $SESS_DBH, $SESS_LIFE;        $qry = "SELECT value FROM sessions WHERE sesskey = '$key' AND expiry > " . time();        $qid = $SESS_DBH->query($qry);        if (list($value) = $qid->fetchRow()) {                return $value;        }        return false;}function sess_write($key, $val) {        global $SESS_DBH, $SESS_LIFE;        $expiry = time() + $SESS_LIFE;        $value = addslashes($val);        $qry = "INSERT INTO sessions VALUES ('$key', $expiry, '$value')";        $qid = $SESS_DBH->query($qry);        if (!DB::isError($qid)) {                $qry = "UPDATE sessions SET expiry = $expiry, value = '$value' WHERE sesskey = '$key' AND expiry > " . time();                $qid = $SESS_DBH->query($qry);        }        return $qid;}function sess_destroy($key) {        global $SESS_DBH;        $qry = "DELETE FROM sessions WHERE sesskey = '$key'";        $qid = $SESS_DBH->query($qry);        return $qid;}function sess_gc($maxlifetime) {        global $SESS_DBH;        $qry = "DELETE FROM sessions WHERE expiry < " . time();        $qid = $SESS_DBH->query($qry);        return $SESS_DBH->affectedRows();}session_set_save_handler("sess_open","sess_close","sess_read","sess_write",                         "sess_destroy","sess_gc");?>

四、结语

Web服务器使用的HTTP是一种无状态协议,可用Cookie和会话管理技术弥补这一不足。由于Cookie技术有很大的局限性,目前常用会话管理机制保存用户的访问状态。会话技术的采用,不仅解决了大容量会话信息的存取问题,而且大大方便了Web服务器应用程序的开发。在常见的三种会话管理机制中,基于数据库的会话管理机制最容易扩展,对访问量负载能力也较强。

Linux联盟收集整理

相关文章

·使用mdadm快速创建RAID5
·hping--强大的TCP/IP工具
·Linux系统桌面应用软件大全
·如何安装和使用wine
·fsck , fuser , findfs , fixfiles命令介绍
·FreeBSD入门安装及汉化
·关于yum太慢了的解决方案
·用机器生成的音乐监控Linux 计算机
·FC6 Linux下如何写NTFS分区文件
·重新思考安全含义—让Linux系统更安全

热门文章

·利用135端口漏洞入侵个人电脑
·网吧频繁掉线(ARP)与解决方
·新手学堂:防火墙在网络中的
·害怕受网络攻击 英国公民干脆
·知己知彼:IEXPLORE命令行参
·保护个人隐私 隐藏在图片背后
·顶尖网络高手写的alexa作弊完
·国庆期间有45万余台计算机感
·病毒门诊:清除猖狂的Sxs.ex
·电脑用户须知 忘记分级审查密

Copyright@2005 www.linuxGoo.com All Right Reserved