监听器 - session 销毁

一、统计在线用户数等功能需要监听session的销毁,有两种方式: 

  1. 使用HttpSessionListener监听session的销毁。 
  2. 使用HttpSessionBindingListener监听session的销毁。

1、使用HttpSessionListener

package advance;

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 + "超时退出");
    }
}
    <listener>
        <listener-class>advance.OnlineUserListener</listener-class>
    </listener>

以下两种情况下就会发生sessionDestoryed(会话销毁)事件: 
  1.执行session.invalidate()方法时。 
  2.如果用户长时间没有访问服务器,超过了会话最大超时时间,服务器就会自动销毁超时的session。


2、设置Session有效时间的三种方式

(1)在主页面或者公共页面中加入:

HttpSession session = request.getSession(true);  
session.setMaxInactiveInterval(900);

单位是秒,即在没有活动15分钟后,session将失效。这里要注意这个session设置的时间是根据服务器来计算的,而不是客户端。 
(2)在项目的web.xml中设置

<session-config>
    <session-timeout>15</session-timeout>
</session-config>

单位是整型分钟。 
(3)直接在应用服务器中设置,如果是tomcat,可以在tomcat目录下conf/web.xml中找到<session-config>元素,tomcat默认设置是30分钟,只要修改这个值就可以了。

Ps:优先级:(1)>(2)>(3)。


3、使用HttpSessionBindingListener

HttpSessionBindingListener虽然叫做监听器,但使用方法与HttpSessionListener完全不同。 
HttpSessionListener只需要设置到web.xml中就可以监听整个应用中的所有session;HttpSessionBindingListener必须实例化后放入某一个session中,才可以进行监听。 
从监听范围上比较,HttpSessionListener设置一次就可以监听所有session,HttpSessionBindingListener通常都是一对一的。

javax.servlet.http.HttpSessionBindingListener接口提供了下面的方法: 
  - public void valueBound(HttpSessionBindingEvent event),当对象正在被绑定到Session中时,Servlet容器会调用这个方法来通知该对象 
  - public void valueUnbound(HttpSessionBindingEvent event),当从Session中删除对象时,Servlet容器调用这个方法来通知该对象 

Servlet容器通过HttpSessionBindingEvent对象来通知实现了HttpSessionBindingListener接口的对象,而该对象可以利用HttpSessionBindingEvent对象来访问与它相联系的HttpSession对象,javax.servlet.http.HttpSessionBindingEvent类提供了以下方法: 
  - public HttpSessionBingdingEvent(HttpSession session,java.lang.String name) 
  - public HttpSessionBingdingEvent(HttpSession session,java.lang.String name,java.lang.Object value) 
  - public javax.lang.String getName(),返回绑定到Session中或者从Session中删除的属性的名字 
  - public java.lang.Object getValue(),返回被添加/删除/替换的属性的值,如果属性被添加或者被删除,这个方法返回属性的值,如果这个属性被替换,这个方法返回属性先前的值 
  - public HttpSession getSession(),返回HttpSession对象

package advance;

import javax.servlet.http.HttpSessionBindingListener;
import javax.servlet.http.HttpSessionBindingEvent;

public class BindingListener implements HttpSessionBindingListener
{
    public void valueBound(HttpSessionBindingEvent arg0) {
        System.out.println("valueBound");
    }

    public void valueUnbound(HttpSessionBindingEvent arg0) {
        System.out.println("valueUnbound");
    }
}
不需要配置web.xml,但要将listener加入session的属性中:

BindingListener  binding = new BindingListener();  
session.setAttribute("anyname", binding ); // 这个时候要触发valueBound方法了

valueUnbound()的触发条件是以下三种情况: 
1. 执行session.invalidate()时。 
2. session超时自动销毁时。 
3. 执行session.setAttribute(“anyname”, “其他对象”)或session.removeAttribute(“anyname”)将listener从session中删除时。只要不将listener从session中删除,就可以监听直到session的销毁。


4、实现关闭浏览器时清除session的方法

在默认情况下,session对象在关闭浏览器后并不是立刻被销毁,因此,为了考虑系统的安全性,在用户退出时,需要即刻清除session对象,防止他人盗用session对象中的信息。

清除session对象内容的主要方法如下:
(1)、removeAttribute()方法。该方法是用来删除session对象中保存的指定属性信息。
例如:session.setAttribute("name", "iverson");session.removeAttribute("name");

(2)、invalidate()方法。该方法可以清除session对象中的所有信息。
例如:session.invalidate().

通常情况下,关闭浏览器后,session信息需要等到session对象失效后才能清除,如果需要实现关闭浏览器后即可清除session信息,请尝试用以下方法:
<body οnbefοreunlοad="window.location='logout.jsp'">
<% HttpSession session = request.getSession(); session.invalidate(); %> // logout.jsp页面中,可以这么做
Ps:onbeforeunload 事件:在即将离开当前页面(刷新或关闭)时执行 JavaScript。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陆氪和他的那些代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值