`
angelbill3
  • 浏览: 256962 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

【总结】Session监听类HttpSessionListener介绍及在listener里取得request

 
阅读更多
servlet-api.jar中提供了监听类HttpSessionListener,主要方法有两个,sessionCreated、sessionDestroyed,根据方法名就能明白是监听session的创建和销毁。

以下是示例:
package com.test;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class SessionTestListener implements HttpSessionListener {
	public void sessionCreated(HttpSessionEvent event) {
		HttpSession session = event.getSession();
		System.out.println("session Created: " + session);
	}

	public void sessionDestroyed(HttpSessionEvent event) {
		System.out.println("session Destroyed.");
	}
}


方法里可以写一些tracking的逻辑,也可以累计登陆次数等等。另外别忘了在web.xml里注册这个监听类(具体代码略)。

--------------------------------
来说说在用到这个监听类的一些总结。首先不可避免的要在sessionCreated方法中想要取得request对象(进而取得用户ip,浏览器等属性),但是HttpSessionEvent显然直接取不到request对象。

研究了下,发现spring(主要是context jar包)提供了监听类:RequestContextListener,可直接配在web.xml中,通过这个监听器,可以直接拿到request上下文。示例如下:

HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
System.out.println(request.getHeader("user-agent"));


--------------------------------
另外,在sessionCreated虽然能取得request对象,但千万不能写request.getSession(true)类似的方法,这样会引起死循环,理由是sessionCreated监听session被创建时,此时的session还没有完全被建立,因为用request.getSession(true)并不能拿到我们想要的那个session实例(大家都知道request.getSession(true) 表示获取session对象,若session不存在则会再创建)。

于是就会悲剧的陷入:监听方法中用request取得session,没拿到,创建session,监听方法又生效,生效后继续取得session,没拿到,创建session... 这样的循环中。

综上,session实例应从HttpSessionEvent拿。





分享到:
评论

相关推荐

    javaweb监听session

    本文将详细介绍如何在Java Web项目中设置和使用Session监听器,以及如何根据Session ID获取Session。 首先,为了实现Session监听,我们需要创建一个实现了`javax.servlet.http.HttpSessionListener`接口的类。这个...

    session监听

    - **监听类编写**:为了实现session监听功能,我们需要编写一个类实现`HttpSessionListener`接口。在这个类中,需要重写两个方法: - `sessionCreated(HttpSessionEvent se)`:当一个新的session被创建时调用此方法...

    过滤器filter和监听器listener的应用总结

    在Java Web开发中,过滤器(Filter)和监听器(Listener)是两个非常重要的概念,它们主要用于增强应用程序的功能和管理应用程序的状态。这篇文章将对这两者的应用进行深入的总结。 **过滤器Filter** 过滤器是在...

    利用session监听器实现一个客户不能再两个客户端登录。

    本文将深入探讨如何利用Session监听器来防止同一用户在多个客户端同时登录。 首先,理解Session的基本概念至关重要。Session是服务器为每个用户创建的一种存储机制,用于保存用户状态信息。当用户登录成功后,...

    STRUTS:listener监听器

    在Java Web开发中,监听器(Listener)是十分重要的组成部分,它们主要用于监听特定事件的发生,并执行相应的处理逻辑。Struts框架作为早期流行的MVC架构之一,充分利用了监听器机制来增强其功能性和灵活性。本文将...

    java jsp listener小用法

    常见的监听器接口有HttpSessionListener、ServletRequestListener、ApplicationListener等。 二、登录次数监听器的实现 1. 创建监听器类:要记录登录次数,我们需要创建一个实现了javax.servlet....

    判断session过期的方式

    以下是一个简单的Session监听器示例: ```java @WebListener public class SessionListener implements HttpSessionListener, HttpSessionAttributeListener { @Override public void sessionDestroyed...

    监听器.pdf

    监听器.pdf 监听器是Java Web开发中的一种重要机制,用于监听和响应Web应用程序中的事件...在上面的例子中,我们实现了HttpSessionBindingListener接口,并在valueBound方法中监听java对象在Session中的状态发生改变。

    监听器实现在线人数统计

    Session监听器是实现了`javax.servlet.http.HttpSessionListener`接口的类,它可以监听到Session的创建和销毁事件,从而判断用户的登录和登出。 下面是一个简单的Session监听器的代码示例: ```java import javax....

    session过期时间设置

    对于Tomcat这类应用服务器,可以在`conf/web.xml`或`server.xml`中定义Context元素来设置Session超时时间,例如: ```xml <Context ... defaultSessionTimeout="3600"> <!-- 1小时 --> ``` 在Session失效后,...

    listener的实例代码

    本篇将深入讲解`Listener`的概念、作用以及如何通过实例代码进行实现,特别关注在Web应用程序中的三种主要域对象:`request`、`session`和`servletContext`。 一、`Listener`的基本概念 `Listener`是Java中的接口,...

    servlet 监听器范例

    在Java Web开发中,Servlet监听器(Servlet Listener)扮演着重要的角色,它是Servlet规范的一部分,允许开发者对Web应用程序中的特定事件进行监听和响应。在这个范例中,我们将深入探讨如何利用监听器来统计在线...

    Java中的Listener监听器

     Session监听  Request监听  · Listener的应用实例  利用HttpSessionListener统计多在线用户人数  Spring使用ContextLoaderListener加载ApplicationContext配置信息  Spring使用Log4jConfigListener...

    Servlet对Cookie和Session的管理源码实例

    Servlet容器支持监听器(Listener),如`HttpSessionListener`和`HttpSessionAttributeListener`,它们可以监听Session的创建、销毁和属性变化。监听器可用来统计在线用户、清理过期Session等。 ```java @Web...

    JavaWebServlet+JSP+EL表达式+JSTL标签库+Filter过滤器+Listener监听器

    例如,HttpSessionListener可以监听session的创建和销毁,ServletContextListener监听应用的启动和关闭。通过注册监听器,开发者可以在特定时刻执行一些初始化或清理工作。 在实际开发中,这些组件通常结合使用。...

    网络应用开发 之 监听对象的属性变更

    在IT行业中,网络应用开发是不可或缺的一部分,而监听对象的属性变更则是提升应用程序响应性和效率的重要技术。在Java Web开发中,特别是在使用Servlet时,我们可以利用监听器来监控和响应对象状态的变化,从而实现...

    Javaweb监听器实例之统计在线人数

    在Java Web开发中,监听器(Listener)是一种用于监控Web应用中各种事件的组件,包括诸如对象创建、销毁,会话开始、结束等。本文将详细介绍如何使用监听器来统计在线用户人数,包括实现的基本思路、具体代码实现...

    JSP监听器用法分析.docx

    总结来说,JSP监听器提供了一种强大的机制,让开发者能够在Web应用程序的关键事件中插入自定义代码,从而实现更灵活和高效的控制。通过理解并熟练使用各种监听器接口,开发者可以更好地管理会话、跟踪用户行为、优化...

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

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

    过滤器和监听器的使用

    例如,Session监听器可以监听会话的创建、过期等事件,ServletContext监听器可以监听上下文的初始化和销毁事件,Request监听器可以监听请求的开始和结束。监听器的实现通常需要实现特定接口,如HttpSessionListener...

Global site tag (gtag.js) - Google Analytics