`
woshixushigang
  • 浏览: 580454 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

session监听销毁跳转

 
阅读更多

   1.了解如何使用HttpSessionListener监听session的销毁。
   2.了解如何使用HttpSessionBindingListener监听session的销毁。

一. 使用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中看到输出的信息。


二. 使用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的销毁。

分享到:
评论

相关推荐

    day18 监听器 统计在线人数,定时销毁超时session,钝化活化session,在线列表显示和踢人功能防止用户自动登录,在线支付

    在本主题“day18 监听器 统计在线人数,定时销毁超时session,钝化活化session,在线列表显示和踢人功能防止用户自动登录,在线支付”中,我们将深入探讨这些关键知识点。 首先,让我们了解监听器的作用。监听器是...

    J简单的springmvc包括拦截、session设置,超时跳转

    注意,Session有一个默认的超时时间,超过这个时间未有任何操作,Session将被销毁。可以通过`session.setMaxInactiveInterval(int interval)`设置超时时间,单位为秒。 **超时跳转(Session Timeout Redirect)** ...

    Session过期后自动跳转到登录页面的实例代码

    首先,开发者可能尝试使用Session监听器(HttpSessionListener)来检测Session的过期。监听器是Java Servlet规范的一部分,允许我们注册监听器以响应特定的事件,如Session的创建和销毁。在`web.xml`文件中,我们...

    session过期处理

    一是设置Session监听器,监听Session的销毁事件;二是每次接收到请求时,检查Session的有效性,如果过期则进行处理。 3. **Session过期后的处理**:常见的处理方式包括: - 弹出登录框:当检测到Session过期,...

    关闭页面时清空Session (ASP.net ) (已实现)

    根据提供的文件信息,本文将详细解释如何在ASP.NET应用程序中实现关闭页面时清除Session状态的...通过监听页面卸载事件并在合适的时机调用Session清除方法,可以有效地管理Session生命周期,提高系统的性能和安全性。

    退出页面自动清除session技巧

    当用户在应用程序的不同页面之间跳转时,存储在Session中的变量不会被销毁,而会在整个用户会话期间一直存在。这种机制可以方便地在多个页面间共享数据,并且有助于提高用户体验。 #### 清除Session的重要性 清除...

    redis+tomcat实现session的jar

    3. **Session监听器**:在Tomcat中注册监听器,监控session的创建、更新、销毁等事件,并相应地在Redis中进行操作。 4. **配置文件**:可能包含示例或默认的配置文件,用于设置Redis服务器的地址、端口、超时时间等...

    redis-session-manager-tomcat6共享包

    3. 配置session监听器:可能需要创建一个实现了`javax.servlet.http.HttpSessionListener`接口的类,以便在session创建和销毁时进行相应操作,例如同步Redis中的session状态。 4. 重启Tomcat:完成上述配置后,重启...

    redis的session共享

    Spring MVC提供了`HttpSessionListener`和`HttpSessionAttributeListener`接口,可以监听Session的创建、修改和销毁事件。我们可以通过创建一个实现了这些接口的类,将Session数据存储到Redis中。同时,需要配置...

    Tomcat+redis、session同步

    - **监听器**:在`Tomcat`中添加`SessionListener`,以便在`session`创建、销毁时通知`Redis`,保持两者同步。 - **冲突解决**:在分布式环境下,可能有多个服务器同时尝试更新同一`session`,需要确保`Redis`的...

    session与cookie的内容.doc

    - session:在整个会话期间有效,直到会话结束或显式销毁。 - application:在整个Web应用生命周期内有效,直到Web应用停止。 **Filter(过滤器)** 过滤器在Web应用中用于拦截请求,实现预处理或后处理。常见的...

    使用maven 部署环境 mvc模式 实现 登录 退出登录注册 过滤和监听的功能

    监听器是Servlet API的一部分,可以监听特定事件,比如session的创建和销毁。我们创建一个`SessionListener`,在session创建时记录用户登录,在session销毁时记录用户退出。 11. **配置Web.xml** 在`WEB-INF/web....

    在线人数统计

    在本例中,我们监听session的创建和销毁事件,以跟踪在线人数的变化。当用户首次访问网站并创建session时,我们可以将用户视为在线;当用户关闭浏览器或者session超时,session被销毁,我们则减少在线人数。 2. **`...

    JSP开发中在spring mvc项目中实现登录账号单浏览器登录.docx

    在JSP开发中,Spring MVC项目常常用于构建复杂的Web...当用户尝试在第二个浏览器中登录时,第一个浏览器的session会被销毁,用户需要重新登录。这种方法有效地防止了同一账号在多个地方同时在线,增强了系统的安全性。

    Ajax + PHP session制作购物车

    6. 用户注销:在用户选择注销操作后,需要在服务器端销毁session,以清除用户的所有会话数据。 整个购物车的实现需要考虑到数据的安全性,例如密码传输需要进行加密,session数据存储时要有防止跨站脚本攻击(XSS)...

    用web.xml控制Web应用的行为

    例如,我们可以监听Session的创建和销毁: ```xml &lt;listener-class&gt;com.example.SessionCreationListener&lt;/listener-class&gt; &lt;listener-class&gt;com.example.SessionDestroyListener&lt;/listener-class&gt; ``` 这里...

    jsp+servlet的登陆注册

    6. **监听器(Listener)**:监听器是用于响应特定事件的Java类,如session的创建、销毁、超时等。它们通过实现特定接口并注册到Web应用的部署描述符(web.xml)中。在用户登录注册场景下,监听器可能用于跟踪...

    一个nginx和tomcat负载的例子,附上实现(已测试)

    例如,可以自定义一个`HttpSessionBindingListener`来监听session的创建和销毁,实现session数据的持久化: ```java public class RedisSessionManager implements HttpSessionBindingListener { private Jedis ...

    JSP软件开发文件

    Tomcat服务器的默认监听端口为8080。 4. **JSP中include指令与include动作的区别** - `include`指令是静态包含,它将被包含页面的源代码直接合并到当前页面,编译时完成,不关心被包含页面的后续修改。 - `...

    java 分页思想

    Session监听器在Java Web开发中用于监听Session的创建和销毁事件,可能在这个场景中用于跟踪用户的分页状态。当用户从一页跳转到另一页时,可以在Session中存储当前的页码,以便在用户再次访问时恢复之前的浏览位置...

Global site tag (gtag.js) - Google Analytics