http服务器--session处理
1. 概述
Session处理是一般带有会话功能服务器必须处理的功能.使用session记录一个会话,能够有效处理短连接或者断线重连的需求。session是存放在服务器的内容,具有如下特性:
A. 时间性,创建的session如果长时间没有响应,则服务器需要删除该session,以防止session的无限增长。
B. 唯一性,在同一个服务器上,sessionId不能重复,如果重复就会出现歧义。
C. 全局性,对于是否为同一会话,服务器上只认sessionId是否一致,多个客户端也可以用同一个session。
D. 安全性,session是存在于服务器端的,对客户端不可见,所有对客户端的操作都需要经过服务器的代码。
E. 数据类型无限制性,Session可以根据服务器的处理需求,存放任何类型的数据。
F. ....
2. Session的创建与释放
在http服务器上,每一次交互都是基于会话的,所以对于每一个新的连接都需要创建一个session。一个session通过唯一的sesssionId标识,并通过cookie传递给客户端。对于老的连接,其sessionID可能已经被释放,服务器就需要为其创建新的session。
session的释放,只有两个条件:超时不响应和客户端强制释放。由于session具有全局性,其创建与释放必须互斥进行。Session的操作,也需要互斥进行,以防止内存的变化导致程序异常。
3. 本程序的实现
基于上次发布的http开发sdk,这次特别完善session,使之成为一个实际可用的http服务器开发包。
一个session可能被多个客户端同时使用,如下图:
释放时需要等待所有客户端退出之后才能释放。我们采用引用计数的方式记录当前引用的客户端数量。在客户端连接成功后引用计数加一,断开连接后计数减一。在一个定时器中定时检查响应时间和引用计数值。
在上层使用session时,不需要关心session是如何创建如何释放的。只要按照规则实现session的创建和释放接口,具体如何调用由底层负责。
3.1. 上层实现的接口
3.1.1. 定义自己的session类
在该架构下,我们要求所有session类必须派生于CMfhHttpSession。在CMfhHttpSession类中会实现基本的session操作。当然为了方便编写程序,可以直接使用CMfhHttpSession类。如果需要对session做特殊处理,例如存放自定义格式的数据,就需要实现自己的session。
3.1.2. 创建session接口
Session是在会话处理类Httpbase中创建。我们只需要实现:
Virtual CMfhHttpSession* CMfhHttpBase::CreateSession(char* sessionId);方法即可。在该方法中只负责根据sessionId创建session,不需要关心何时调用该方法。
自定义的会话处理类派生于Httpbase,如果我们需要特殊处理session,则重新实现虚函数CreateSession,创建自己的session类。
3.1.3. Session的使用
Session在创建之后,或者处理cookie时找到对应的session会保存在会话处理类中成员变量.m_session中。在会话处理时直接使用即可。
目前暂未发布开发包,后续会整理发布,如果需要可以与我联系,可先使用。
联系邮箱:[email protected]