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

servlet-api.jar中提供了监听类[b]HttpSessionListener[/b],主要方法有两个,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包)提供了监听类:[b]RequestContextListener[/b],可直接配在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拿。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值