记录一段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

================
 原本是session預設一次600秒,session死了要600秒才剔除
改為
5秒x120次,Session死了,5秒就剔除
也可以改
3秒x200次,
 

记录一段QQ关于 UNIGUI 的Session 时间设定的更多相关文章

  1. 记录这段时间java编程的小知识点

    记录这段时间java编程的小知识点 eclipse项目导入中文乱码 eclipse左侧目录结构变动 eclipse代码段左右移动 按tal键,是整体右移. 按shift  table 同时按,是整体左 ...

  2. 为QNetworkAccessManager添加超时提醒(自己记录一段时间里的下载字节数,用定时器去定期检测,从而判断是否超时)

    在做更新,在测试异常的时候,在下载过程中,发现如果直接系统禁用了网络,会报错误,可以捕获.但是如果是第三方软件限制程序联网,问题来了. 程序会一直在那里等待,没有异常,也不发送QNetworkAcce ...

  3. spring boot 延长 Session 时间

    1.查看session时间    默认1800s 通过request.getSession().getMaxInactiveInterval()可以查看你的session时间 2.延长session ...

  4. unigui的session【1】

    目前是1394. 明白session如何使用管理,看demo Session List和SessionTimeout unit Main; interface uses Windows, Messag ...

  5. 安卓手机端微信网页浏览记录清理debugx5.qq.com

    最近我们环境从复)星(云切换到阿里云.早上地铁路上就有小伙伴@,一阵搜索.找的如下的方法. 记录一下: 目前只支持安卓手机的微信内置浏览器清理. 由腾讯提供的网址http://debugx5.qq.c ...

  6. Yocto开发笔记之《错误记录》(QQ交流群:519230208)

    QQ群:519230208,为避免广告骚扰,申请时请注明 “开发者” 字样 ============================================== 提问: 1. 怎样修改linu ...

  7. 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 ...

  8. 用python悄悄记录了室友的抖音在线时间

    今天给大家分享一篇有趣的文章,灵感来自于前几天与室友的聊天,他告诉我抖音可以实时显示人的在线情况,如下图: 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在 ...

  9. cookie+session,会话时间设定

    很多Web程序中第一次登录后,在一定时间内(如2个小时)再次访问同一个Web程序时就无需再次登录,而是直接进入程序的主界面(仅限于本机). 实现这个功能关键就是服务端要识别客户的身份.而用Cookie ...

随机推荐

  1. 剑指Offer_编程题_12

    题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. class Solution { public: double Power(d ...

  2. hive metastore && hiveserver2 . jvm 配置调整优化

    hive-env.sh 添加如下,其中踩坑踩了不少. if [ "$SERVICE" = "metastore" ]; then if [ -z "$ ...

  3. 利用 JMetal 实现大规模聚类问题的研究(二) JMetal代码总览

    之前完成了导入JMetal到自己的工程这一步. 在开始我们研究的问题之前,我们先对JMetal的源代码一个全局的认识. JMetal很好地利用了面向对象的特性,对所有的优化问题做了高度的抽象,建议有空 ...

  4. Redis之Transactions(事物)

    你问我Redis支不支持事物?告诉你,Redis对事物的支持是部分支持(对比关系型数据库,没有强一致性) 定义:一个队列.一次性.顺序的.排他性的执行一系列命令 常用命令: DISCARD 取消事物, ...

  5. expdp和impdp导入导出用法【转】

    关于expdp和impdp exp和imp是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用.expdp和impdp是服务端的工具程序,他们只能在ORACLE服务端使用,不能在客户端使用.i ...

  6. vue使用vue-awesome-swiper及一些问题

    vue-awesome-swiper是基于swiper的一个轮播图插件,使用非常方便. 首先安装下 npm install vue-awesome-swiper --save 然后在入口文件main. ...

  7. Linux系统中用户组、文件权限浅解

    用户组 在linux中的每个用户必须属于一个组,不能独立于组外.在Linux中每个文件有所有者.所在组.其它组的概念. [所有者] 一般为文件的创建者,谁创建了该文件,就天然的成为该文件的所有者,用& ...

  8. 细说shiro之自定义filter

    写在前面 我们知道,shiro框架在Java Web应用中使用时,本质上是通过filter方式集成的. 也就是说,它是遵循过滤器链规则的:filter的执行顺序与在web.xml中定义的顺序一致,如下 ...

  9. Mac 开发使用中的小技巧收集

    1. mac 下ssh连接到 linux 服务器管理,同putty,无需第三方 Mac 下打开终端,输入: ssh 登录用户名@ip地址 如: ssh root@142.138.1.89 如有询问是否 ...

  10. MVC中的分部视图

    背景: 项目的工期马上就要到了,由于后台封装的很好,我们只需要用心熟悉框架,接下来后台的工作就是简单的代码工作了.原本以为最困难的时期已经过去,可没想到前台才是最困难的. B/S的基础十分薄弱,加上B ...