[原创]ASP保持在线用户最新处理办法

由于需要准确控制在线人数,但是很难捕获用户关闭浏览器的事件来清理online表中的在线用户记录,造成在线人数不准,利用global.asa的session_onEnd处理,又不能及时清除,只有在timeout和session被清空时才触发,没办法只能在数据表online加入Inser,Update触发器清除定时30分钟后的记录来保持在线人session超时后有人上线或更新online的date时间后删除超时的online记录。
OnLine表结构

<span class="pun">******</span><span class="pln"> </span><span class="pun">对象:</span><span class="pln">  </span><span class="typ">Table</span><span class="pln"> </span><span class="pun">[</span><span class="pln">dbo</span><span class="pun">].[</span><span class="pln">online</span><span class="pun">]</span><span class="pln">    </span><span class="pun">脚本日期:</span><span class="pln"> </span><span class="lit">07</span><span class="pun">/</span><span class="lit">02</span><span class="pun">/</span><span class="lit">2008</span><span class="pln"> </span><span class="lit">09</span><span class="pun">:</span><span class="lit">43</span><span class="pun">:</span><span class="lit">10</span><span class="pln"> </span><span class="pun">******/</span><span class="pln">
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
</span><span class="typ">Cr</span><span class="pun">&</span><span class="com">#101;ate TABLE [dbo].[online](</span><span class="pln">
</span><span class="pun">[</span><span class="pln">id</span><span class="pun">]</span><span class="pln"> </span><span class="pun">[</span><span class="kwd">int</span><span class="pun">]</span><span class="pln"> IDENTITY</span><span class="pun">(</span><span class="lit">1</span><span class="pun">,</span><span class="lit">1</span><span class="pun">)</span><span class="pln"> NOT NULL</span><span class="pun">,</span><span class="pln">
</span><span class="pun">[</span><span class="pln">compid</span><span class="pun">]</span><span class="pln"> </span><span class="pun">[</span><span class="kwd">int</span><span class="pun">]</span><span class="pln"> NULL CONSTRAINT </span><span class="pun">[</span><span class="pln">DF_online_compid</span><span class="pun">]</span><span class="pln">  DEFAULT </span><span class="pun">((</span><span class="lit">0</span><span class="pun">)),</span><span class="pln">
</span><span class="pun">[</span><span class="pln">employeeId</span><span class="pun">]</span><span class="pln"> </span><span class="pun">[</span><span class="kwd">int</span><span class="pun">]</span><span class="pln"> NULL</span><span class="pun">,</span><span class="pln">
</span><span class="pun">[</span><span class="pln">sdate</span><span class="pun">]</span><span class="pln"> </span><span class="pun">[</span><span class="pln">datetime</span><span class="pun">]</span><span class="pln"> NULL CONSTRAINT </span><span class="pun">[</span><span class="pln">DF_online_sdate</span><span class="pun">]</span><span class="pln">  DEFAULT </span><span class="pun">(</span><span class="pln">getdate</span><span class="pun">()),</span><span class="pln">
</span><span class="pun">[</span><span class="pln">online</span><span class="pun">]</span><span class="pln"> </span><span class="pun">[</span><span class="kwd">int</span><span class="pun">]</span><span class="pln"> NULL</span><span class="pun">,</span><span class="pln">
CONSTRAINT </span><span class="pun">[</span><span class="pln">PK_online</span><span class="pun">]</span><span class="pln"> PRIMARY KEY CLUSTERED
</span><span class="pun">(</span><span class="pln">
</span><span class="pun">[</span><span class="pln">id</span><span class="pun">]</span><span class="pln"> ASC
</span><span class="pun">)</span><span class="pln">WITH </span><span class="pun">(</span><span class="pln">PAD_INDEX  </span><span class="pun">=</span><span class="pln"> OFF</span><span class="pun">,</span><span class="pln"> STATISTICS_NORECOMPUTE  </span><span class="pun">=</span><span class="pln"> OFF</span><span class="pun">,</span><span class="pln"> IGNORE_DUP_KEY </span><span class="pun">=</span><span class="pln"> OFF</span><span class="pun">,</span><span class="pln"> ALLOW_ROW_LOCKS  </span><span class="pun">=</span><span class="pln"> ON</span><span class="pun">,</span><span class="pln"> ALLOW_PAGE_LOCKS  </span><span class="pun">=</span><span class="pln"> ON</span><span class="pun">)</span><span class="pln"> ON </span><span class="pun">[</span><span class="pln">PRIMARY</span><span class="pun">]</span><span class="pln">
</span><span class="pun">)</span><span class="pln"> ON </span><span class="pun">[</span><span class="pln">PRIMARY</span><span class="pun">]</span>

页面每次进入或刷新时判断sdate是否超过30分钟,如果超过更新sdate的时间为当前最新时间,这样保持在线时间一直是最新的时间,避免被删除

<span class="pun">&</span><span class="com">#39;判断用户登录状态</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> session</span><span class="pun">(</span><span class="str">"checklogin"</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">then</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> session</span><span class="pun">(</span><span class="str">"zjzxid"</span><span class="pun">)<></span><span class="lit">0</span><span class="pln"> </span><span class="kwd">then</span><span class="pln">
sessioncompid</span><span class="pun">=</span><span class="pln">session</span><span class="pun">(</span><span class="str">"zjzxid"</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">else</span><span class="pln">
sessioncompid</span><span class="pun">=</span><span class="pln">session</span><span class="pun">(</span><span class="str">"compid"</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">end</span><span class="pln"> </span><span class="kwd">if</span><span class="pln">
employee</span><span class="pun">=</span><span class="pln">session</span><span class="pun">(</span><span class="str">"employee"</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">set</span><span class="pln"> online</span><span class="pun">=</span><span class="pln">server</span><span class="pun">.</span><span class="pln">cr</span><span class="pun">&</span><span class="com">#101;ateobject("adodb.recordset")</span><span class="pln">
</span><span class="pun">&</span><span class="com">#39;跟数据表中暂存的用户ID进行判断,其中sessioncompid中存储的是用户ID</span><span class="pln">
online</span><span class="pun">.</span><span class="pln">open </span><span class="str">"sel&#101;ct id,compid,sdate from online wh&#101;re compid="</span><span class="pun">&</span><span class="pln">sessioncompid</span><span class="pun">&</span><span class="str">" and employeeid="</span><span class="pun">&</span><span class="pln">employee</span><span class="pun">,</span><span class="pln">conn</span><span class="pun">,</span><span class="lit">1</span><span class="pun">,</span><span class="lit">1</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> online</span><span class="pun">.</span><span class="pln">recordcount</span><span class="pun"><></span><span class="lit">0</span><span class="pln"> </span><span class="kwd">then</span><span class="pln">
</span><span class="pun">&</span><span class="com">#39;如果表中有该用户的话,就判断存储时间是否超出设置的超时时间</span><span class="pln">
</span><span class="pun">&</span><span class="com">#39;如果超时,那么将系统时间赋上,以保证当前的用户的状态</span><span class="pln">
oldid</span><span class="pun">=</span><span class="pln">online</span><span class="pun">(</span><span class="str">"id"</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> DATEDIFF</span><span class="pun">(</span><span class="str">"n"</span><span class="pun">,</span><span class="pln">online</span><span class="pun">(</span><span class="str">"sdate"</span><span class="pun">),</span><span class="pln">now</span><span class="pun">())></span><span class="lit">30</span><span class="pln"> </span><span class="kwd">then</span><span class="pln">
sql</span><span class="pun">=</span><span class="str">"up&#100;ate online set sdate=getdate() wh&#101;re id="</span><span class="pun">&</span><span class="pln">oldid
conn</span><span class="pun">.</span><span class="pln">execute sql
</span><span class="kwd">end</span><span class="pln"> </span><span class="kwd">if</span><span class="pln">
</span><span class="kwd">else</span><span class="pln">
</span><span class="pun">&</span><span class="com">#39;如果表中没有该用户,则进行添加操作</span><span class="pln">
sql</span><span class="pun">=</span><span class="str">"ins&#101;rt into online (compid) values ("</span><span class="pun">&</span><span class="pln">sessioncompid</span><span class="pun">&</span><span class="str">")"</span><span class="pln">
conn</span><span class="pun">.</span><span class="pln">execute sql
</span><span class="kwd">end</span><span class="pln"> </span><span class="kwd">if</span><span class="pln">
online</span><span class="pun">.</span><span class="pln">close
</span><span class="kwd">set</span><span class="pln"> online</span><span class="pun">=</span><span class="pln">nothing
</span><span class="kwd">end</span><span class="pln"> </span><span class="kwd">if</span>

触发器

<span class="typ">Alt</span><span class="pun">&</span><span class="com">#101;r TRIGGER [dbo].[clearOnline]</span><span class="pln">
ON  </span><span class="pun">[</span><span class="pln">dbo</span><span class="pun">].[</span><span class="pln">online</span><span class="pun">]</span><span class="pln">
AFTER </span><span class="typ">Ins</span><span class="pun">&</span><span class="com">#101;rt,Up&#100;ate</span><span class="pln">
AS
</span><span class="kwd">BEGIN</span><span class="pln">
</span><span class="pun">--</span><span class="pln"> SET NOCOUNT ON added to prevent extra result sets </span><span class="kwd">from</span><span class="pln">
</span><span class="pun">--</span><span class="pln"> interfering </span><span class="kwd">with</span><span class="pln"> </span><span class="typ">Sel</span><span class="pun">&</span><span class="com">#101;ct statements.</span><span class="pln">
SET NOCOUNT ON</span><span class="pun">;</span><span class="pln">
</span><span class="pun">--</span><span class="pln"> </span><span class="typ">Ins</span><span class="pun">&</span><span class="com">#101;rt statements for trigger here</span><span class="pln">
</span><span class="typ">Del</span><span class="pun">&</span><span class="com">#101;te online wh&#101;re datediff(minute,sdate,getdate())>30</span><span class="pln">
</span><span class="kwd">END</span>
赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

登录

注册