记录一段QQ关于 UNIGUI 的Session 时间设定
记录一段QQ关于 UNIGUI 的Session 时间设定,来自[台中]cmj(31365722):
1.UniGUI的Session就是UniMainModule。
2.SessionTimeOut預設600000 即600秒,其代表 Session在完全沒有動作下只能存
活600秒,所謂動作是鍵盤、滑鼠、事件觸發,。
3.SessionTimeOut 600秒,若Session在600秒死了,系統也要等該Session滿600
秒後才會回收,可能造成無用的Session占用系統資源一段時間。
4.SessionTimeout設為5秒鐘,Session 5秒鐘就快速回收,不會有無用Session大
量存在問題,但存活時間只有5秒鐘。
5.以上兩點都有問題,解決方式是加一個次數,即5秒x120次數=600秒,再利用
Session展延機制,這樣Session可以存活600秒,沒用的Session也在5秒鐘
快速回收。
[UNIGui Session回收流程]
SessionTimeout時間到→TUniMainModule.UniGUIMainModuleSessionTimeout事件→是否展延?
否: TUniMainModule.UniGUIMainModuleDestroy,回收.
是: 繼續存活一個SessionTimeout時間
[UniServerModule]
屬性: SessionTimeout: Session存在時間(完全沒有動作之下),不可改變.
只能在UniGUIServerModuleBeforeInit事件設定
加入變數
public
SessionTimeCount:Integer; //SessionTimeout 存活次數
LastSessionCreateTime:TDateTime; //最後Session建立時間
procedure TUniServerModule.UniGUIServerModuleBeforeInit(Sender:
TObject);
begin
Self.SessionTimeout:=5*1000; //存活一次時間5秒
Self.SessionTimeCount:=60; //60次,總存活時間=5x60=300秒
Self.LastSessionCreateTime:=now; //第一個Session建立時間
end;
[UniMainModule]
屬性: TerminateOnBrowserClose 一定設為True;
加入變數
public
SessionTimeCount: Integer; //Session存活次數,一次為一SessionTimeOut
IsALive:Boolean; //Session是否活著
procedure TUniMainModule.UniGUIMainModuleBrowserClose(Sender: TObject);
begin
Self.SessionTimeCount:=0; //Session展延次數取消,準備回收
end;
procedure TUniMainModule.UniGUIMainModuleCreate(Sender: TObject);
var dt:TDateTime; //Session建立時間
DSec:integer; //Session與前一個Session建立的時間差
begin
dt:=Now;
DSec:=SecondsBetween(Dt , UniServerModule.LastSessionCreateTime);
//兩個Session建立間隔需大於2秒,以防止2秒內大量建Session
if (DSec<=2) then UniSession.Terminate();
//記錄最後一個Session建立時間
UniServerModule.LastSessionCreateTime:=Dt;
Self.SessionTimeCount:=UniServerModule.SessionTimeCount; //存活次數
if UniServerModule.SessionManager.Sessions.SessionList.Count>500 then
//最多500 Session建立
begin
//UniServerModule.MyLog.Add('Session數>500');
UniSession.Terminate();
end;
end;
procedure TUniMainModule.UniGUIMainModuleHandleRequest(ASession:
TObject;var Handled: Boolean);
var Session:TUniGUISession;
begin
Self.SessionTimeCount:=UniServerModule.SessionTimeCount;
//Keyboard,mouse,or其他動作重設SessionTimeout次數
end;
procedure TUniMainModule.UniGUIMainModuleSessionTimeout(ASession:
TObject; var ExtendTimeOut: Integer);
var Session:TUniGUISession;
begin
//Session:= TUniGUISession(ASession);
//Session已死,未曾執行UniLoginFormAfterShow或UniFormCreate事件
if not Self.IsALive then Self.SessionTimeCount:=0;
//存活次數大於0時就展延
if (Self.SessionTimeCount>0) then
begin
ExtendTimeOut:=UniServerModule.SessionTimeout
end
else
UniSession.Terminate(); //立即回收Session
//展延次數減一次
Self.SessionTimeCount:=Self.SessionTimeCount-1;
end;
[LoginForm]
若沒有LoginForm改為MainForm的AfterShow事件
procedure TLoginForm.UniLoginFormAfterShow(Sender: TObject);
begin
//在瀏覽器連續F5或重新整理5次,則產生5個Session,前4個Session是死
//的不會執行本事件
TUniMainModule(UniSession.UniMainModule).IsALive:=True;
end;
[MainForm]
顯示所有Session
拖入三件控件,一個TuniListBox Name=LbSession,
一個TuniButton Name=UniButton3 Caption=Session List
一個TuniButton Name=UniButton2 Caption=Clear
procedure TMainForm.UniFormAfterShow(Sender: TObject);
begin
//在瀏覽器連續F5 5次,則產生5個Session,前4個Session是死的,不會執行
//本事件
TUniMainModule(UniSession.UniMainModule).IsALive:=True;
end;
procedure TMainForm.UniButton3Click(Sender: TObject);
var UserList:TList; //登入Session List
i:integer;
Session:TUniGUISession;
m:TUniMainModule;
begin
UserList:=UniServerModule.SessionManager.Sessions.SessionList;
for i:=0 to UserList.Count-1 do
begin
Session:=TUniGUISession(Userlist[i]);
m:=TUniMainModule(Session.UniMainModule);
Self.LbSession.Items.Add(inttostr(i)+': '+
Session.SessionId +' , '+
inttostr(m.SessionTimeCount)+',Is Alive='+
GetEnumName( TypeInfo(Boolean) , Ord(m.IsALive))
);
end;
Self.LbSession.Items.Add('--------------------------------------');
end;
procedure TMainForm.UniButton2Click(Sender: TObject);
begin
Self.LbSession.Clear;
end;
[測試]
開兩個瀏覽器
瀏覽器1 監看Session
瀏覽器2 登入後快速重整多次,以模擬大量產生Session
改為
5秒x120次,Session死了,5秒就剔除
也可以改
3秒x200次,
记录一段QQ关于 UNIGUI 的Session 时间设定的更多相关文章
- 记录这段时间java编程的小知识点
记录这段时间java编程的小知识点 eclipse项目导入中文乱码 eclipse左侧目录结构变动 eclipse代码段左右移动 按tal键,是整体右移. 按shift table 同时按,是整体左 ...
- 为QNetworkAccessManager添加超时提醒(自己记录一段时间里的下载字节数,用定时器去定期检测,从而判断是否超时)
在做更新,在测试异常的时候,在下载过程中,发现如果直接系统禁用了网络,会报错误,可以捕获.但是如果是第三方软件限制程序联网,问题来了. 程序会一直在那里等待,没有异常,也不发送QNetworkAcce ...
- spring boot 延长 Session 时间
1.查看session时间 默认1800s 通过request.getSession().getMaxInactiveInterval()可以查看你的session时间 2.延长session ...
- unigui的session【1】
目前是1394. 明白session如何使用管理,看demo Session List和SessionTimeout unit Main; interface uses Windows, Messag ...
- 安卓手机端微信网页浏览记录清理debugx5.qq.com
最近我们环境从复)星(云切换到阿里云.早上地铁路上就有小伙伴@,一阵搜索.找的如下的方法. 记录一下: 目前只支持安卓手机的微信内置浏览器清理. 由腾讯提供的网址http://debugx5.qq.c ...
- Yocto开发笔记之《错误记录》(QQ交流群:519230208)
QQ群:519230208,为避免广告骚扰,申请时请注明 “开发者” 字样 ============================================== 提问: 1. 怎样修改linu ...
- matlab中,计算,记录,程序运行,起始,结束 时间,间隔 &matlab中 tic,toc函数的用法
Tic和toc函数可以计算运行一段时间的代码. 例如: clc tic d=zeros(1,10000); for i=1:10000 d(i)=i; end toc tic c=1; for i=1 ...
- 用python悄悄记录了室友的抖音在线时间
今天给大家分享一篇有趣的文章,灵感来自于前几天与室友的聊天,他告诉我抖音可以实时显示人的在线情况,如下图: 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在 ...
- cookie+session,会话时间设定
很多Web程序中第一次登录后,在一定时间内(如2个小时)再次访问同一个Web程序时就无需再次登录,而是直接进入程序的主界面(仅限于本机). 实现这个功能关键就是服务端要识别客户的身份.而用Cookie ...
随机推荐
- linux下查看主板内存槽与内存信息
1.查看内存槽数.那个槽位插了内存,大小是多少 dmidecode|grep -P -A5 "Memory\s+Device"|grep Size|grep -v Range 2. ...
- 搭建Hadoop集群(生产环境)
1.搭建之前:百度copy一下介绍 (本博客几乎全都是生产环境的配置..包括mongo等hbase其他) Hadoop是一个由Apache基金会所开发的分布式系统基础架构. 用户可以在不了解分布式底层 ...
- CodeForces - 867E Buy Low Sell High (贪心 +小顶堆)
https://vjudge.net/problem/CodeForces-867E 题意 一个物品在n天内有n种价格,每天仅能进行买入或卖出或不作为一种操作,可以同时拥有多种物品,问交易后的最大利益 ...
- python-虚拟环境搭建
虚拟环境 需求: --公司之有一台服务器 -目前运行这一个5年前开发的Django项目,基于1.5 -现在要基于Django2.0开发一套程序 ...
- Docker-01 无人值守升级 CentOS 6.x 系统内核到 3.10.x 长期支持版
#!/bin/bash # # 无人值守升级 CentOS .x 系统内核到 3.10.x 长期支持版 # # # .检查操作系统是否为 CentOS .x # cat /etc/centos-rel ...
- C#中转换函数Convert、Parse、TryParse、(int) 的区别
Convert.Parse.TryParse.(int) 三个函数都是将值转换成整数,但是四者之间各有异同,开发人员可以根据情况选用最合适的.以下解释均经过高人验证,希望对大家有所帮助. 1 (int ...
- Spring使用事务增加的注解实现方
以下是我的文件结构 步骤1:配置数据源 <bean id="datasource" class="com.mchange.v2.c3p0.ComboPooledDa ...
- 【LeetCode】335. Self Crossing(python)
Problem:You are given an array x of n positive numbers. You start at point (0,0) and moves x[0] metr ...
- 【python小练】0002
第 0002 题:将 0001 题生成的 200 个激活码(或者优惠券)保存到 MySQL 关系型数据库中. . . .(一脸懵逼) Python访问数据库:(廖雪峰python教程) 1. SQLi ...
- 使用PHP+MySql操作——实现微信投票功能
1. 投票主页面: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://w ...