首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 操作系统-> 经验技巧
Servlet中如何捕获Session事件?-JSP教程,Jsp/Servlet
作者:网友供稿 点击:27
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 
捕获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("yeeyoo.log"+i);
  if(!(file.exists()))
    file.createnewfile();   //如果文件不存在,创建此文件
  if(file.length()>1048576) //如果文件大于1m,重新创建一个文件
    continue;
    fileoutputstream foo=new fileoutputstream("yeeyoo.log"+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("count"))
    {
        return;
    }
    try{
calendar calendar=new gregoriancalendar();
system.out.println("logout:"+privateinfo+" time:"+calendar.gettime());
logstring="\nlogout:"+privateinfo+" time:"+calendar.gettime()+"\n";
for(int i=1;i<1000;i++){
  file file=new file("yeeyoo.log"+i);
  if(!(file.exists()))
    file.createnewfile();   //如果文件不存在,创建此文件
  if(file.length()>1048576) //如果文件大于1m,重新创建一个文件
    continue;
    fileoutputstream foo=new fileoutputstream("yeeyoo.log"+i,true);//以append方式打开创建文件
    foo.write(logstring.getbytes(),0,logstring.length()); //写入日志字符串
    foo.close();
    break;//退出
}
    }catch(filenotfoundexception e){}
     catch(ioexception e){}
}

}

登录日志的实现:

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


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


文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·JSP页面中的自定义标签2-JSP教程,Jsp/Servlet
·C#中调用消息对话框,并取得其返回值-.NET教程,C#语言
·StringBuffer帮你减轻Java的负担-JSP教程,Java技巧及代码
·asp之字符串函数示例-ASP教程,ASP应用
·不用iconv库的gb2312与utf-8的互换函数-PHP教程,数据库相关
·windows硬件驱动程序安装目录列表详解
·ASP中正则表达式的应用-ASP教程,ASP基础
·关于VB.net中无法使用VB6控件-.NET教程,VB.Net语言
·清除垃圾 给你的电脑减负让其全速运行
·win98和winxp双系统启动菜单的恢复
最新文章
·别浪费你的大内存 如何给windows提速_经验技巧
·用frontpage手把手教你制作网上电影的发布_frontpages教程
·有效管理系统字体的七种绝技_经验技巧
·c盘空间再小也能安装字体_经验技巧
·不破坏硬盘数据将fat32转为ntfs分区的方法_经验技巧
·服务器变慢的两种非常规解决办法_经验技巧
·seo:刚入门还不如不入门的_seo网站优化
·教你快速释放windows系统资源的小绝招_经验技巧
·巧用流量交换联盟 轻松日入至少60元_网赚技巧
·john chow博客赚钱电子书:必要的 wordpress 装备_网赚技巧
相关主题
  • servlet实现访问次数的例子_jsp技巧
  • servlet动态产生jpeg图像的例子_jsp技巧
  • Servlet与Web服务-JSP教程,Jsp/Servlet
  • Servlet中jdbc应用高级篇-JSP教程,Jsp/Servlet
  • Servlet和JSP知识复习(2)Servlet基础-JSP教程,Jsp/Servlet
  • 西部数码虚拟主机

    友情链接
    CNNIC 西部数码
    万网 自助建站
    虚拟主机 asp空间
    域名注册 域名
    域名申请 主页空间
    论坛空间 网站空间
    国际域名 虚拟空间
    空间租用 DDOS防火墙
    成都主机托管 四川主机托管
    主机租用 服务器租用
    网站目录 自助建站
    虚拟主机 网址大全
    软件下载
    自助链接
    虚拟主机资讯 特价虚拟主机
    版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
    关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
    特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
    发表评论 打印  刷新     关闭