选择显示字体大小

servlet中如何捕获session事件

捕获session事件的意义:
1、 记录网站的客户登录日志(登录,退出信息等)
2、 统计在线人数
3、 等等还有很多,呵呵,自己想吧……总之挺重要的。

session代表客户的会话过程,客户登录时,往session中传入一个对象,即可跟踪客户的会话。在servlet中,传入session的对象如果是一个实现httpsessionbindinglistener接口的对象(方便起见,此对象称为监听器),则在传入的时候(即调用httpsession对象的setattribute方法的时候)和移去的时候(即调用httpsession对象的removeattribute方法的时候或session time out的时候)session对象会自动调用监听器的valuebound和valueunbound方法(这是httpsessionbindinglistener接口中的方法)。
由此可知,登录日志也就不难实现了。
另外一个问题是,如何统计在线人数,这个问题跟实现登录日志稍微有点不同,统计在线人数(及其信息),就是统计现在有多少个session实例存在,我们可以增加一个计数器(如果想存储更多的信息,可以用一个对象来做计数器,随后给出的实例中,简单起见,用一个整数变量作为计数器),通过在valuebound方法中给计数器加1,valueunbound方法中计数器减1,即可实现在线人数的统计。当然,这里面要利用到servletcontext的全局特性。(有关servletcontext的叙述请参考servlet规范),新建一个监听器,并将其实例存入servletcontext的属性中,以保证此监听器实例的唯一性,当客户登录时,先判断servletcontext的这个属性是否为空,如果不为空,证明已经创建,直接将此属性取出放入session中,计数器加1;如果为空则创建一个新的监听器,并存入servletcontext的属性中。

举例说明:

实现一个监听器:
// sessionlistener.java

import java.io.*;
import java.util.*;
import javax.servlet.http.*;

//监听登录的整个过程
public class sessionlistener implements httpsessionbindinglistener
{

public string privateinfo=""; //生成监听器的初始化参数字符串
private string logstring=""; //日志记录字符串
private int count=0; //登录人数计数器

public sessionlistener(string info){
this.privateinfo=info;
}

public int getcount(){
return count;
}

public void valuebound(httpsessionbindingevent event)
{
count++;
if (privateinfo.equals("count"))
{
return;
}
try{
calendar calendar=new gregoriancalendar();
system.out.println("login:"+privateinfo+" time:"+calendar.gettime());
logstring="\nlogin:"+privateinfo+" time:"+calendar.gettime()+"\n";
for(int i=1;i<1000;i++){
file file=new file(&quot;yeeyoo.log&quot;+i);
if(!(file.exists()))
file.createnewfile(); //如果文件不存在,创建此文件
if(file.length()>1048576) //如果文件大于1m,重新创建一个文件
continue;
fileoutputstream foo=new fileoutputstream(&quot;yeeyoo.log&quot;+i,true);//以append方式打开创建文件
foo.write(logstring.getbytes(),0,logstring.length()); //写入日志字符串
foo.close();
break;//退出
}
}catch(filenotfoundexception e){}
catch(ioexception e){}
}

public void valueunbound(httpsessionbindingevent event)
{
count--;
if (privateinfo.equals(&quot;count&quot;))
{
return;
}
try{
calendar calendar=new gregoriancalendar();
system.out.println(&quot;logout:&quot;+privateinfo+&quot; time:&quot;+calendar.gettime());
logstring=&quot;\nlogout:&quot;+privateinfo+&quot; time:&quot;+calendar.gettime()+&quot;\n&quot;;
for(int i=1;i<1000;i++){
file file=new file(&quot;yeeyoo.log&quot;+i);
if(!(file.exists()))
file.createnewfile(); //如果文件不存在,创建此文件
if(file.length()>1048576) //如果文件大于1m,重新创建一个文件
continue;
fileoutputstream foo=new fileoutputstream(&quot;yeeyoo.log&quot;+i,true);//以append方式打开创建文件
foo.write(logstring.getbytes(),0,logstring.length()); //写入日志字符串
foo.close();
break;//退出
}
}catch(filenotfoundexception e){}
catch(ioexception e){}
}

}

登录日志的实现:

下面再来看看我们的登录servlet中使用这个监听器的部分源代码:
&hellip;&hellip;
httpsession session = req.getsession (true);
&hellip;&hellip;
///////////////////////////////////////////////////////////////////////
sessionlistener sessionlistener=new sessionlistener(&quot; ip:&quot;+req.getremoteaddr()); //对于每一个会话过程均启动一个监听器
session.setattribute(&quot;listener&quot;,sessionlistener); //将监听器植入httpsession,这将激发监听器调用valuebound方法,从而记录日志文件。
///////////////////////////////////////////////////////////////////////
当系统退出登录时,只需简单地调用session.removeattribute(&ldquo;listener&rdquo;);即可自动调用监听器的valueunbound方法。或者,当session time out的时候也会调用此方法。


登录人数的统计:
servletcontext session1=getservletconfig().getservletcontext();//取得servletcontext对象实例
if((sessionlistener)session1.getattribute(&quot;listener1&quot;)==null)
{
sessionlistener sessionlistener1=new sessionlistener(&quot;count&quot;);//只设置一次,不同于上面日志文件的记录每次会话均设置。即当第一个客户连接到服务器时启动一个全局变量,此后所有的客户将使用相同的上下文。
session1.setattribute(&quot;listener1&quot;,sessionlistener1);//将监听器对象设置成servletcontext的属性,具有全局范围有效性,即所有的客户均可以取得它的实例。
}
session.setattribute(&quot;listener1&quot;,(sessionlistener)session1.getattribute(&quot;listener1&quot;));//取出此全局对象,并且将此对象绑定到某个会话中,此举将促使监听器调用valuebound,计数器加一。
在此后的程序中随时可以用以下代码取得当前的登录人数:
((sessionlistener)session.getattribute(&quot;listener1&quot;)).getcount()
getcount()是监听器的一个方法,即取得当前计数器的值也就是登录人数了。
from-javaresearch.org


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons