C++项目:在线五子棋对战网页版--session管理模块开发

session 

在WEB开发中,HTTP协议是⼀种⽆状态短链接的协议,这就导致⼀个客⼾端连接到服务器上之后,服务器不知道当前的连接对应的是哪个用户,也不知道客⼾端是否登录成功,这时候为客⼾端提所有服务是不合理的。因此,服务器为每个用户浏览器创建⼀个会话对象(session对象),注意:⼀个浏览器独占⼀个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使⽤浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,识别该连接对应的用户,并为用户提供服务。

这⾥简单设计⼀个session类,但是session对象不能⼀直存在,这样是⼀种资源泄漏,因此需要使⽤定时器对每个创建的session对象进⾏定时销毁(⼀个客⼾端连接断开后,⼀段时间内都没有重新连接则销毁session)。

session类

对于一个用户独占的session来说,需要有session的一个id,也就是标识符,需要对于的用户id,登录状态,以及session需要用到的定时器。

session类需要提供设置session状态,设置用户id和定时器的方法,需要提供给外界获取session标识符,用户id和定时器的方法,需要提供判断session是否处于登录状态的方法。

typedef enum {UNLOGIN, LOGIN} ss_statu;
class session
{
private:uint64_t _ssid;//session标识符uint64_t _uid;//用户idss_statu _statu;//用户状态:未登录,已登录wsserver_t::timer_ptr _tp;//session关联的定时器
public:session(uint64_t ssid): _ssid(ssid){ DLOG("SESSION %p 被创建!!", this); }~session() { DLOG("SESSION %p 被释放!!", this); }uint64_t ssid(){return _ssid;}/*获取session的标识符*/uint64_t get_user(){return _uid;}/*获取用户id*/wsserver_t::timer_ptr& get_timer() { return _tp; }/*获取定时器*/void set_statu(ss_statu statu){_statu = statu;}/*设置session的状态*/void set_user(uint64_t uid){_uid = uid;}/*设置session的用户id*/void set_timer(wsserver_t::timer_ptr& tp){_tp = tp};/*设置定时器*/bool is_login(){return (_statu == LOGIN);}/*判断是否处于登录状态*/};

session管理类

将session类实现好之后,接下来就是需要将session统一管理起来了。

在session管理类中,需要对每一个session进行编号,而这个编号,就是session的标识符ssid,是不能乱编,为了避免session编号出现错误,因此采用计数器的方式,并且将session交由智能指针shared_ptr去管理,这样就方便进行操作了。

在session管理类中,主要实现这些方法:

创建session、通过ssid获取session、通过ssid判断session是否存在、销毁session和为session设置过期时间,过期后session被销毁。

using session_ptr = std::shared_ptr<session>;
#define SESSION_TIMEOUT 300000
#define SESSION_FOREVER -1
class session_manager
{
private:uint64_t _next_ssid;std::mutex _mutex;std::unordered_map<uint64_t,session_ptr> _session;wsserver_t * _server;
public:session_manager(wsserver_t *srv):_next_ssid(1),_server(srv){DLOG("session管理器初始化完毕!");}~session_manager(){DLOG("session管理器即将销毁!");}/*创建session*/session_ptr create_session(uint64_t uid, ss_statu statu){std::unique_lock<std::mutex> lock(_mutex);/*创建出一个新的session,通过智能指针管理*/session_ptr ssp(new session(_next_ssid));/*设置session的状态、用户id*/ssp->set_statu(statu);ssp->set_user(uid);/*将session的智能指针与session的ssid建立映射关系*/_session.insert(std::make_pair(_next_ssid,ssp));_next_ssid++;return ssp;}/*将ssp进行管理*/void append_session(const session_ptr &ssp){std::unique_lock<std::mutex> lock(_mutex);_session.insert(std::make_pair(ssp->ssid(),ssp));}/*通过ssid获取session信息*/session_ptr get_session_by_ssid(uint64_t ssid){std::unique_lock<std::mutex> lock(_mutex);auto it = _session.find(ssid);if(it==_session.end()){return session_ptr();}return it->second;}/*销毁session*/void remove_session(uint64_t ssid) {std::unique_lock<std::mutex> lock(_mutex);_session.erase(ssid);}/*为ssid对应的session设置生命周期*/void set_session_expire_time(uint64_t ssid, int ms){//依赖于websocketpp的定时器来完成session生命周期的管理。//登录之后,创建session,session需要在指定时间无通信后删除// 但是进入游戏大厅,或者游戏房间,这个session就应该永久存在// 等到退出游戏大厅,或者游戏房间,这个session应该被重新设置为临时,在长时间无通信后被删除/*首先通过ssid获取session信息*/session_ptr ssp = get_session_by_ssid(ssid);if (ssp.get() == nullptr) {return;}/*获取session中的定时器*/wsserver_t::timer_ptr tp = ssp->get_timer();/*根据情况进行设置*//*1.在session永久存在的情况下,设置永久存在*/if(tp.get() == nullptr && ms == SESSION_FOREVER){/*session本身就已经永久存在了*/return;}else if(tp.get() == nullptr && ms != SESSION_FOREVER){/*在session永久存在的情况下,设置指定时间之后被删除的定时任务*//*创建出一个临时的定时器,将该定时器设置为:过了ms的时间后,会调用remove_session函数进行session的销毁*/wsserver_t::timer_ptr tmp_tp = _server->set_timer(ms,std::bind(&session_manager::remove_session,this,ssid));ssp->set_timer(tmp_tp);/*设置进去*/}else if(tp.get() != nullptr && ms == SESSION_FOREVER){//3. 在session设置了定时删除的情况下,将session设置为永久存在// 删除定时任务--- stready_timer删除定时任务会导致任务直接被执行tp->cancel();//因为这个取消定时任务并不是立即取消的//因此重新给session管理器中,添加一个session信息, 且添加的时候需要使用定时器,而不是立即添加ssp->set_timer(wsserver_t::timer_ptr());//将session关联的定时器设置为空_server->set_timer(0, std::bind(&session_manager::append_session, this, ssp));}else if(tp.get() != nullptr && ms != SESSION_FOREVER){// 4. 在session设置了定时删除的情况下,将session重置删除时间。tp->cancel();//因为这个取消定时任务并不是立即取消的ssp->set_timer(wsserver_t::timer_ptr());_server->set_timer(0, std::bind(&session_manager::append_session, this, ssp));//重新给session添加定时销毁任务wsserver_t::timer_ptr tmp_tp  = _server->set_timer(ms, std::bind(&session_manager::remove_session, this, ssp->ssid()));//重新设置session关联的定时器ssp->set_timer(tmp_tp);}}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/82490.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

乐鑫首创|使用 ESP RainMaker® 私有云定制 Matter 生态

ESP RainMaker 是乐鑫的 AIoT 云平台&#xff0c;支持客户自主部署私有物联网云&#xff0c;从而全面掌握数据所有权和管理权&#xff0c;实现定制功能与服务。ESP RainMaker 云后端采用 AWS 无服务器架构&#xff0c;拥有开源的 iOS 和 Android 移动端 APP、第三方语音助手集成…

手搓 自然语言模型 LLM 拆分em结构设计 网络参数对比

数据 数据集 新的em编码参数表 voc_sizehidden_sizetotaltotal Bmax_lensecondsdays65536512374865920.03749B10242560.2655361024828375040.08284B20485120.5655362048<

Vue 中使用 WebWorker

目录 安装 loader 应用场景 打包时错误处理 安装 loader npm install worker-loader -D 如果直接把worker.js放到public目录下&#xff0c;则不需要安装loader vue.config.js const { defineConfig } require(vue/cli-service)module.exports defineConfig({transpileDe…

AcWing 24:机器人的运动范围 ← BFS、DFS

【题目来源】https://www.acwing.com/problem/content/description/22/【题目描述】 地上有一个 m 行和 n 列的方格&#xff0c;横纵坐标范围分别是 0∼m−1 和 0∼n−1。 一个机器人从坐标 (0,0) 的格子开始移动&#xff0c;每一次只能向左&#xff0c;右&#xff0c;上&#…

day10 快速排序 方法重载 和 方法递推

方法重载 斐波拉契数列问题 使用重载思想解决 public static int method(int n){if (n 2 ){return 1 ;}return (n-1)*2method(n-1);}public static int f(int n){if (n 1){return 1;}if (n 2){return 2;}return f(n-1)f(n-2);} 快速排序 思维很简单&#xff0c;类似二…

Python爬虫的Selenium(学习于b站尚硅谷)

目录 一、Selenium  1.为什么要学习Selenium  &#xff08;1&#xff09;什么是Selenium  &#xff08;2&#xff09;为什么使用selenium?  &#xff08;3&#xff09;代码演示 2. selenium的基本使用  &#xff08;1&#xff09;如何安装selenium  &#xff08;2…

MySQL5.7源码编译Debug版本

编译环境Ubuntu22.04LTS 1 官方下载MySQL源码 https://dev.mysql.com/downloads/mysql/?spma2c6h.12873639.article-detail.4.68e61a14ghILh5 2 安装基础软件 cmakeclangpkg-configperl 参考&#xff1a;https://dev.mysql.com/doc/refman/5.7/en/source-installation-prere…

c语言每日一练(4)

五道选择题 1、有以下代码&#xff0c;程序的输出结果是( ) #include <stdio.h> int main() {int a 0, b 0;for (a 1, b 1; a < 100; a){if (b > 20) break;//1if (b % 3 1)//2{b b 3;continue;}b b-5;//3}printf("%d\n", a);return 0; } A.1…

MySQL: Failed to Connect to MySQL at XXXX:3306 with user root

客户端连接MySQL服务器&#xff0c;报错&#xff1a; 解决方案&#xff1a; 没有让root用户远程登录&#xff0c;需要设置&#xff1b; 进入MySQL服务器&#xff0c;修改一下 # mysql -h localhost -uroot -P3306 -p12345678 mysql: [Warning] Using a password on the comm…

IoTDB 1.x 开启外部访问

对于部署的IoTDB数据库&#xff0c;如果需要局域网内其他设备进行访问的处理。 1、防火墙开放端口 无论windows还是liunx都需要你将6667默认的端口加入防火墙中&#xff0c;否则肯定是无法访问端口 2、修改配置文件 对conf/iotdb-datanode.properties文件中的 修改为本机的…

【ChatGPT 指令大全】怎么使用ChatGPT来帮我们写作

在数字化时代&#xff0c;人工智能为我们的生活带来了无数便利和创新。在写作领域&#xff0c;ChatGPT作为一种智能助手&#xff0c;为我们提供了强大的帮助。不论是作文、文章&#xff0c;还是日常函电&#xff0c;ChatGPT都能成为我们的得力助手&#xff0c;快速提供准确的文…

‘vue’不是内部或外部命令,也不是可运行的程序或批处理文件的原因及解决方法

今天我在用node.js的时候&#xff0c;结果出现如下错误&#xff1a; C:\Users\xiesj> vue -v vue不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。 原因&#xff1a; 1、确定npm是否已正确安装&#xff1f; 2、确定vue以及vue-cli已正确安装&#xff1f;…

COCOS项目运行的时候图片模糊的原因

1、首先。用X坐标来分析&#xff0c;如果size*Anchor Position有小数&#xff0c;如上图57*0.5667695.5。这样就会导致x模糊。如果y同样计算结果包含小数&#xff0c;那么y也会模糊。xy同时模糊的情况是最模糊的。 2、如果当前node没有问题&#xff0c;那么就要检查上级node是…

@ControllerAdvice注解使用及原理探究 | 京东物流技术团队

最近在新项目的开发过程中&#xff0c;遇到了个问题&#xff0c;需要将一些异常的业务流程返回给前端&#xff0c;需要提供给前端不同的响应码&#xff0c;前端再在次基础上做提示语言的国际化适配。这些异常流程涉及业务层和控制层的各个地方&#xff0c;如果每个地方都写一些…

CD4029计数器实测仿真及BCD转七段码

前面的博文中&#xff0c;我们介绍过CD40110(这是一个常见的直接接7段数码管的计数器&#xff0c;我们这里介绍一款新的计数器CD4029&#xff0c;这也是很常见的计数器&#xff0c;不同的是后者可以输出BCD编码。 文章目录 一、总体效果二、CD4029的管脚和功能介绍1、芯片功能简…

【CSS】旋转中的视差效果

效果 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"/><meta http-equiv"X-UA-Compatible" content"IEedge"/><meta name"viewport" content"widthdevice-…

【算法|数组】快慢指针

算法|数组——快慢指针 引入 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你…

图像的平移变换之c++实现(qt + 不调包)

1.基本原理 设dx为水平偏移量&#xff0c;dy为垂直偏移量&#xff0c;则平移变换的坐标映射关系为下公式&#xff0c;图像平移一般有两种方式。 1.不改变图像大小的平移&#xff08;一旦平移&#xff0c;相应内容被截掉&#xff09; 1&#xff09;当dx > width、dx < -wi…

hive编译报错整理

背景 最近在修hive-1.2.0的一个bug&#xff0c;需要修改后重新打包部署到集群&#xff0c;打包的时候报下面的错误&#xff0c;原因很简单&#xff0c;从远程仓库里面已经拉不到这个包了。 org.pentaho:pentaho-aggdesigner-algorithm:jar:5.1.5-jhyde was not found in http…

用 docker 创建 jmeter 容器,能做性能测试?

我们都知道&#xff0c;jmeter 可以做接口测试&#xff0c;也可以用于性能测试&#xff0c;现在企业中性能测试也大多使用 jmeter。docker 是最近这些年流行起来的容器部署工具&#xff0c;可以创建一个容器&#xff0c;然后把项目放到容器中&#xff0c;就可以构建出一个独立的…