- 浏览: 677200 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (254)
- java分布式应用架构 (22)
- SSH框架整合 (6)
- java web 学习笔记 (49)
- java 学习笔记 (56)
- struts 2 学习 (6)
- Hibernate学习 (10)
- spring 学习 (2)
- 客户端编程(javascript) (4)
- IDE使用 (13)
- 生命 人生 (6)
- 系统维护 (3)
- 技术篇 (10)
- MySql (2)
- J2ME (1)
- java网络编程 (4)
- 数据库 (5)
- C/C++ (8)
- Oracle (7)
- 软件测试 (0)
- 软件的安装和部署 (0)
- Java快讯 (1)
- swt (1)
- Flex (1)
- 软件工程 (1)
- PostgreSQL (1)
- sql server2000 (2)
- 嵌入式数据库sqlite (5)
- J2EE (1)
- XML (1)
- ibatis3(MyBatis) (6)
- Linux&Unix (1)
- velocity (1)
- 回报社会 (4)
- 软件项目管理 (3)
- android研究 (3)
- C# (2)
- Objective-C (1)
- 音乐 (0)
- webx (1)
- JMS (1)
- maven软件项目管理 (1)
- 分布式服务 (0)
- 云平台 (0)
- 分布式存储 (1)
- 分布式系统架构 (0)
- 移动互联网 (1)
- ZooKeeper (1)
最新评论
-
liyys:
楼主,可不可以发这个项目的源码工程出来分享一下,少了几个类。楼 ...
仿照Hibernate实现一个SQLite的ORM框架 -
liyys:
少了一些类的源码没有粘贴出来
仿照Hibernate实现一个SQLite的ORM框架 -
honglei0412:
我使用的是这种方式获取db文件的目录但是 URL p = Fi ...
使用sqlite注意事项 -
honglei0412:
大侠 能不能说明下DbFile您是怎么做的吗?
使用sqlite注意事项 -
ahack:
刚写完mapping才发现早就有人写好了。仔细一看还都是针对的 ...
仿照Hibernate实现一个SQLite的ORM框架
捕获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()是监听器的一个方法,即取得当前计数器的值也就是登录人数了。
-------------------------------------------------------------------------------->>>>>>>>>>
另一个代码:
你应该对user object 实现HttpSessionBindingListener的valueBound和valueUnbound方法
____________________________________________________________
import javax.servlet.*;
import javax.servlet.http.*;
public class UseridWrapper implements HttpSessionBindingListener
{
public String userid = "0";
public User(String id)
{
this.userid = id;
}
public void valueBound(HttpSessionBindingEvent e)
{
System.out.println("the user with id: "+this.userid+" logon!");
//here can use one Singleton object to manage the user list,
//ex: UserManager.add(this);
}
public void valueUnbound(HttpSessionBindingEvent e)
{
System.out.println("the user with id"+this.userid+" exit!");
//here can use one Singleton object to manage the user list,
//ex: UserManager.remover(this);
}
}
//______________________________________________________________
使用:
User user=new User("1");
session.setAttribute("Login",);//触发valueBound事件
使用:
session.invalidate() or session is timeout 触发valueUnbound()
>>>>>>
//______________________________________________________________
使用:
UseridWrapper user=new UseridWrapper ("1");
session.setAttribute("Login",user);//触发valueBound事件
使用:
session.invalidate() or session is timeout 触发valueUnbound()
以上代码基本可实现在线统计功能,加以修改就可以了
8.1. 使用HttpSessionListener
编写一个OnlineUserListener。
package anni;
import java.util.List;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionListener;
import javax.servlet.http.HttpSessionEvent;
public class OnlineUserListener implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent event) {
}
public void sessionDestroyed(HttpSessionEvent event) {
HttpSession session = event.getSession();
ServletContext application = session.getServletContext();
// 取得登录的用户名
String username = (String) session.getAttribute("username");
// 从在线列表中删除用户名
List onlineUserList = (List) application.getAttribute("onlineUserList");
onlineUserList.remove(username);
System.out.println(username + "超时退出。");
}
}
OnlineUserListener实现了HttpSessionListener定义的两个方法:sessionCreated()和sessionDestroyed()。这两个方法可以监听到当前应用中session的创建和销毁情况。我们这里只用到sessionDestroyed()在session销毁时进行操作就可以。
从HttpSessionEvent中获得即将销毁的session,得到session中的用户名,并从在线列表中删除。最后一句向console打印一条信息,提示操作成功,这只是为了调试用,正常运行时删除即可。
为了让监听器发挥作用,我们将它添加到web.xml中:
<listener>
<listener-class>anni.OnlineUserListener</listener-class>
</listener>
以下两种情况下就会发生sessionDestoryed(会话销毁)事件:
1.
执行session.invalidate()方法时。
既然LogoutServlet.java中执行session.invalidate()时,会触发 sessionDestory()从在线用户列表中清除当前用户,我们就不必在LogoutServlet.java中对在线列表进行操作了,所以 LogoutServlet.java的内容现在是这样。
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException, IOException {
// 销毁session
request.getSession().invalidate();
// 成功
response.sendRedirect("index.jsp");
}
2.
如果用户长时间没有访问服务器,超过了会话最大超时时间,服务器就会自动销毁超时的session。
会话超时时间可以在web.xml中进行设置,为了容易看到超时效果,我们将超时时间设置为最小值。
<session-config>
<session-timeout>1</session-timeout>
</session-config>
时间单位是一分钟,并且只能是整数,如果是零或负数,那么会话就永远不会超时。
对应例子在08-01,为了验证OnlineUserListener是否能正常执行,我们可以登录两个用户,其中一个点击注销,另一个等待一分钟,然后可以在console中看到输出的信息。
8.2. 使用HttpSessionBindingListener
HttpSessionBindingListener虽然叫做监听器,但使用方法与HttpSessionListener完全不同。我们实际看一下它是如何使用的。
我们的OnlineUserBindingListener实现了HttpSessionBindingListener接口,接口中共定义了两个方法:valueBound()和valueUnbound(),分别对应数据绑定,和取消绑定两个事件。
所谓对session进行数据绑定,就是调用session.setAttribute()把HttpSessionBindingListener保存进session中。我们在LoginServlet.java中进行这一步。
// 把用户名放入在线列表
session.setAttribute("onlineUserBindingListener", new OnlineUserBindingListener(username));
这就是HttpSessionBindingListener和HttpSessionListener之间的最大区别:HttpSessionListener只需要设置到web.xml中就可以监听整个应用中的所有session。 HttpSessionBindingListener必须实例化后放入某一个session中,才可以进行监听。
从监听范围上比较,HttpSessionListener设置一次就可以监听所有session,HttpSessionBindingListener通常都是一对一的。
正是这种区别成就了HttpSessionBindingListener的优势,我们可以让每个listener对应一个 username,这样就不需要每次再去session中读取username,进一步可以将所有操作在线列表的代码都移入listener,更容易维护。
valueBound()方法的代码如下:
public void valueBound(HttpSessionBindingEvent event) {
HttpSession session = event.getSession();
ServletContext application = session.getServletContext();
// 把用户名放入在线列表
List onlineUserList = (List) application.getAttribute("onlineUserList");
// 第一次使用前,需要初始化
if (onlineUserList == null) {
onlineUserList = new ArrayList();
application.setAttribute("onlineUserList", onlineUserList);
}
onlineUserList.add(this.username);
}
username已经通过构造方法传递给listener,在数据绑定时,可以直接把它放入用户列表。
与之对应的valueUnbound()方法,代码如下:
public void valueUnbound(HttpSessionBindingEvent event) {
HttpSession session = event.getSession();
ServletContext application = session.getServletContext();
// 从在线列表中删除用户名
List onlineUserList = (List) application.getAttribute("onlineUserList");
onlineUserList.remove(this.username);
System.out.println(this.username + "退出。");
}
这里可以直接使用listener的username操作在线列表,不必再去担心session中是否存在username。
valueUnbound的触发条件是以下三种情况:
1.
执行session.invalidate()时。
2.
session超时,自动销毁时。
3.
执行session.setAttribute("onlineUserListener", "其他对象");或session.removeAttribute("onlineUserListener");将listener从session中删除时。
因此,只要不将listener从session中删除,就可以监听到session的销毁。
例子在08-02目录下,可以与08-01对比一下异同,两者的最终效果是相同的。
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()是监听器的一个方法,即取得当前计数器的值也就是登录人数了。
-------------------------------------------------------------------------------->>>>>>>>>>
另一个代码:
你应该对user object 实现HttpSessionBindingListener的valueBound和valueUnbound方法
____________________________________________________________
import javax.servlet.*;
import javax.servlet.http.*;
public class UseridWrapper implements HttpSessionBindingListener
{
public String userid = "0";
public User(String id)
{
this.userid = id;
}
public void valueBound(HttpSessionBindingEvent e)
{
System.out.println("the user with id: "+this.userid+" logon!");
//here can use one Singleton object to manage the user list,
//ex: UserManager.add(this);
}
public void valueUnbound(HttpSessionBindingEvent e)
{
System.out.println("the user with id"+this.userid+" exit!");
//here can use one Singleton object to manage the user list,
//ex: UserManager.remover(this);
}
}
//______________________________________________________________
使用:
User user=new User("1");
session.setAttribute("Login",);//触发valueBound事件
使用:
session.invalidate() or session is timeout 触发valueUnbound()
>>>>>>
//______________________________________________________________
使用:
UseridWrapper user=new UseridWrapper ("1");
session.setAttribute("Login",user);//触发valueBound事件
使用:
session.invalidate() or session is timeout 触发valueUnbound()
以上代码基本可实现在线统计功能,加以修改就可以了
8.1. 使用HttpSessionListener
编写一个OnlineUserListener。
package anni;
import java.util.List;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionListener;
import javax.servlet.http.HttpSessionEvent;
public class OnlineUserListener implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent event) {
}
public void sessionDestroyed(HttpSessionEvent event) {
HttpSession session = event.getSession();
ServletContext application = session.getServletContext();
// 取得登录的用户名
String username = (String) session.getAttribute("username");
// 从在线列表中删除用户名
List onlineUserList = (List) application.getAttribute("onlineUserList");
onlineUserList.remove(username);
System.out.println(username + "超时退出。");
}
}
OnlineUserListener实现了HttpSessionListener定义的两个方法:sessionCreated()和sessionDestroyed()。这两个方法可以监听到当前应用中session的创建和销毁情况。我们这里只用到sessionDestroyed()在session销毁时进行操作就可以。
从HttpSessionEvent中获得即将销毁的session,得到session中的用户名,并从在线列表中删除。最后一句向console打印一条信息,提示操作成功,这只是为了调试用,正常运行时删除即可。
为了让监听器发挥作用,我们将它添加到web.xml中:
<listener>
<listener-class>anni.OnlineUserListener</listener-class>
</listener>
以下两种情况下就会发生sessionDestoryed(会话销毁)事件:
1.
执行session.invalidate()方法时。
既然LogoutServlet.java中执行session.invalidate()时,会触发 sessionDestory()从在线用户列表中清除当前用户,我们就不必在LogoutServlet.java中对在线列表进行操作了,所以 LogoutServlet.java的内容现在是这样。
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException, IOException {
// 销毁session
request.getSession().invalidate();
// 成功
response.sendRedirect("index.jsp");
}
2.
如果用户长时间没有访问服务器,超过了会话最大超时时间,服务器就会自动销毁超时的session。
会话超时时间可以在web.xml中进行设置,为了容易看到超时效果,我们将超时时间设置为最小值。
<session-config>
<session-timeout>1</session-timeout>
</session-config>
时间单位是一分钟,并且只能是整数,如果是零或负数,那么会话就永远不会超时。
对应例子在08-01,为了验证OnlineUserListener是否能正常执行,我们可以登录两个用户,其中一个点击注销,另一个等待一分钟,然后可以在console中看到输出的信息。
8.2. 使用HttpSessionBindingListener
HttpSessionBindingListener虽然叫做监听器,但使用方法与HttpSessionListener完全不同。我们实际看一下它是如何使用的。
我们的OnlineUserBindingListener实现了HttpSessionBindingListener接口,接口中共定义了两个方法:valueBound()和valueUnbound(),分别对应数据绑定,和取消绑定两个事件。
所谓对session进行数据绑定,就是调用session.setAttribute()把HttpSessionBindingListener保存进session中。我们在LoginServlet.java中进行这一步。
// 把用户名放入在线列表
session.setAttribute("onlineUserBindingListener", new OnlineUserBindingListener(username));
这就是HttpSessionBindingListener和HttpSessionListener之间的最大区别:HttpSessionListener只需要设置到web.xml中就可以监听整个应用中的所有session。 HttpSessionBindingListener必须实例化后放入某一个session中,才可以进行监听。
从监听范围上比较,HttpSessionListener设置一次就可以监听所有session,HttpSessionBindingListener通常都是一对一的。
正是这种区别成就了HttpSessionBindingListener的优势,我们可以让每个listener对应一个 username,这样就不需要每次再去session中读取username,进一步可以将所有操作在线列表的代码都移入listener,更容易维护。
valueBound()方法的代码如下:
public void valueBound(HttpSessionBindingEvent event) {
HttpSession session = event.getSession();
ServletContext application = session.getServletContext();
// 把用户名放入在线列表
List onlineUserList = (List) application.getAttribute("onlineUserList");
// 第一次使用前,需要初始化
if (onlineUserList == null) {
onlineUserList = new ArrayList();
application.setAttribute("onlineUserList", onlineUserList);
}
onlineUserList.add(this.username);
}
username已经通过构造方法传递给listener,在数据绑定时,可以直接把它放入用户列表。
与之对应的valueUnbound()方法,代码如下:
public void valueUnbound(HttpSessionBindingEvent event) {
HttpSession session = event.getSession();
ServletContext application = session.getServletContext();
// 从在线列表中删除用户名
List onlineUserList = (List) application.getAttribute("onlineUserList");
onlineUserList.remove(this.username);
System.out.println(this.username + "退出。");
}
这里可以直接使用listener的username操作在线列表,不必再去担心session中是否存在username。
valueUnbound的触发条件是以下三种情况:
1.
执行session.invalidate()时。
2.
session超时,自动销毁时。
3.
执行session.setAttribute("onlineUserListener", "其他对象");或session.removeAttribute("onlineUserListener");将listener从session中删除时。
因此,只要不将listener从session中删除,就可以监听到session的销毁。
例子在08-02目录下,可以与08-01对比一下异同,两者的最终效果是相同的。
发表评论
-
Spring MVC集成velocity扩展
2013-07-23 17:18 32181、扩展velocity的视图 [code=" ... -
Java获取客户端信息
2011-09-07 14:48 1624String agent = request.getHeade ... -
获取IP地址
2011-09-07 13:41 2378public String getIpAddrByReques ... -
netty telnet 应用实例server代码
2011-09-07 12:21 1836public class TelnetServer { ... -
Netty中使用Apache Common FileUpload
2011-09-07 12:19 1247/** * 用Netty来实现上传 */ publi ... -
java管理windows进程
2011-08-29 17:34 1747package org.zzuli.xmsb; /** ... -
java反射工具
2011-08-29 17:30 5382package org.liufei.jweb.reflect ... -
java html工具
2011-08-29 17:26 1050package org.liufei.jweb.util; ... -
java将汉字转化为全拼
2011-08-29 17:24 1191package org.liufei.jweb.util; ... -
JSTL API
2011-08-29 15:13 1727JSTL API -
jdbc操作大观园
2011-08-09 17:22 1356最近公司使用jdbc和mybatis比较多,于是自己试着写了一 ... -
Java处理UTF-8带BOM的文本的读写
2011-08-01 11:28 2917什么是BOM BOM(byte-order mark),即字 ... -
Session和Cookie的区别
2011-06-27 16:34 8521、session保存在服务器,客户端不知道其中的信息;coo ... -
ajax应用时html响应生成工具
2011-05-02 19:00 1107package org.zzuli.xmsb.util; ... -
setTimeout和setInterval的使用
2011-05-01 16:00 974这两个方法都可以用来 ... -
javasript 经典技巧
2011-03-04 21:30 14311. oncontextmenu="window.e ... -
javascript窗口
2011-03-04 16:31 1006【1、最基本的弹出窗口 ... -
get and post
2011-01-07 17:22 9681. get 是从服务器上获取数据,post 是向服务器传送数 ... -
web开发人员必学的五堂课
2010-12-20 14:42 962越来越多的Web开发人员 ... -
spring整合MyBatis
2010-11-21 15:08 10525MyBatis Spring 1.0.0-RC2 参考文档 M ...
相关推荐
基于HttpSessionBindingListener的登陆日志操作,记录登陆者的用户名,登录时间到数据库
jsp 统计在线人数实例,是个完整的项目实例,部署即可查看效果! 通过使用:HttpSessionListener、HttpSessionBindingListener来实现. valueBound 方法登录触发。 valueUnbound 方法退出触发。
NULL 博文链接:https://franciswmf.iteye.com/blog/1831974
HttpSessionListener 和HttpSessionBindingListener的区别 HttpSessionBindingListener单点登录。
NULL 博文链接:https://nopainnogain.iteye.com/blog/799596
Spring+Struts2+ibatis 异地登录 HttpSessionBindingListener
这份文档以及刚才提及的Javadoc格式的文档都描述了这两个软件包,Javadoc格式的文档还描述了你应该如何使用这两个软件包中的所有方法。 有关规范 你也许对下面的这些Internet规范感兴趣,这些规范将直接影响到...
1)创建LoginServlet类,来提供用户登录功能,以及接入HttpSessionBindingListener的实现类中进行动态监听, 2)创建OnlineUserBindingListener类实现HtpSessionBindingListener接口,重写其中的两个方法, 3)在类...
8.2. 使用HttpSessionBindingListener 9. 封装taglib组件 9.1. 用taglib实现循环 9.2. 关于jstl 10. 综合电子留言板 10.1. 电子留言板用户指南 10.2. 数据库设计 10.3. 功能设计 10.3.1. 用户管理 10.3.2. ...
该会话将检查对象是否实现了 HttpSessionBindingListener 如果实现了 则 servlet 将通知该对象它已经被绑定到会话 或者已从会话中取消对它的绑定 通知是在绑定方法完成后发送的 对于无效或过期的会话 通知是在会话...
属性监听和bean监听的区别: 属性监听:是对三个容器中的任何属性(包括对象和不是对象的数据,基本...从使用上它不同于前面两个监听器的学习,但给我们的感觉就是一个属性监听的vip用户,这个vip用户是一个JavaBean
17-1 JavaMail 1.3.1 的介绍与使用方法 17-2 JavaMail 范例程序一——传送一般邮件 17-3 JavaMail 范例程序二——传送 HTML 格式的邮件 17-4 JavaMail 范例程序三——传送附件 17-5 JavaMail 范例程序四——传送...
HttpSessionBindingListener HttpSessionContext HttpUtils RequestDispatcher Servlet ServletConfig ServletContext ServletException ServletInputStream ServletOutputStream ServletRequest Servlet...
统计在线人数,是否登录过,小例子,用jsp/HttpSessionBindingListener实现 ,有需要的请猛击下载,无源码。要源码,地址:http://download.csdn.net/source/1845699
HttpSessionBindingListener HttpSessionContext HttpSessionEvent HttpSessionListener HttpUtils RequestDispatcher Servlet ServletConfig ServletContext ServletContextAttributeEvent ...
javax.servlet.Filter javax.servlet.Servlet ...javax.servlet.http.HttpSessionBindingListener javax.servlet.http.HttpSessionAttributeListener javax.servlet.http.HttpSessionActivationListener
6.6.4 sendredirect()和forward()方法的区别 238 6.7 小结 239 第7章 web应用程序的部署 240 7.1 配置任意目录下的web应用程序 240 7.2 war文件 242 7.3 tomcat中servlet的另一种运行方式 244 7.4 与servlet...
6.6.4 sendredirect()和forward()方法的区别 238 6.7 小结 239 第7章 web应用程序的部署 240 7.1 配置任意目录下的web应用程序 240 7.2 war文件 242 7.3 tomcat中servlet的另一种运行方式 244 7.4 与servlet...
6.6.4 sendredirect()和forward()方法的区别 238 6.7 小结 239 第7章 web应用程序的部署 240 7.1 配置任意目录下的web应用程序 240 7.2 war文件 242 7.3 tomcat中servlet的另一种运行方式 244 7.4 与servlet...