站内搜索: 请输入搜索关键词

当前页面: 开发资料首页JSP 专题*监听session超时的另一种方法--finalize()*

*监听session超时的另一种方法--finalize()*

摘要: *监听session超时的另一种方法--finalize()*


http://www.blogjava.net/jfy3d/archive/2006/07/12/57879.html


我顶


好东西,看看去



这种方法是中技巧,但是在实际应用中实在不可取。




just see see


研究一个


jf


看看先


刚作完测试 没具体应用过

pigo() 不知道不可取的原因是?


等待垃圾回收器?感觉总是不那么可靠


况且有sessionDestroyed和sessionAtrributeRemoved方法,何必多此一举呢?


上面这位
sessionDestroyed和sessionAtrributeRemoved
能取到session销毁时里的信息么


取不到么?

import java.util.logging.Logger;

import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class EASessionListener implements HttpSessionListener {

private final Logger logger = Logger.getLogger(this.getClass().getName());

public void sessionCreated(HttpSessionEvent hse) {
HttpSession session = hse.getSession();
session.setAttribute("somevar", "somevalue");
logger.info("session '" + session.getId() + "' is created!");
}

public void sessionDestroyed(HttpSessionEvent hse) {
HttpSession session = hse.getSession();
logger.warning((String) session.getAttribute("somevar"));
logger.info("session '" + session.getId() + "' is destroyed!");
}

}

2006-7-14 16:53:22 org.apache.catalina.startup.Catalina start
信息: Server startup in 1468 ms
2006-7-14 16:53:22 cn.hellfire.eighthart.util.EASessionListener sessionCreated
信息: session '2975E9C48CD8D942068E6CDBCD7E2156' is created!
2006-7-14 16:55:21 cn.hellfire.eighthart.util.EASessionListener sessionDestroyed
警告: somevalue
2006-7-14 16:55:21 cn.hellfire.eighthart.util.EASessionListener sessionDestroyed
信息: session '2975E9C48CD8D942068E6CDBCD7E2156' is destroyed!


1.不可取的原因是得到的信息的时效性太差,

比如某用户登录之后,然后关闭浏览器,此时,需要服务器的线程扫描判断该session是否超时,
这样触发session超时的时间有可能是30分钟以后(假设你在web.xml里设置的30分钟),然后再是等待内存回收来调用finalize,这个时间就很难确定了,这样得到的时间信息误差太大。

而在sessionDestroyed可以得到用户最后一次访问服务器的时间,这样计算出来的用户在线时间才是准确的。


//上面这位sessionDestroyed和sessionAtrributeRemoved能取到session销毁时里的信息么

当然能够得到了,只是早期tomcat4.x版本中存在一个bug,就是在这个时候不能得到sesion中的东西,tomcat5里早已经修正这个bug了。

public void sessionCreated(HttpSessionEvent se) {
System.out.println("刚创建的HttpSession的id为:" + se.getSession().getId() +
",默认超时时间为:" +
se.getSession().getMaxInactiveInterval());

}

public void sessionDestroyed(HttpSessionEvent se) {
HttpSession session = se.getSession();
System.out.println("被销毁的HttpSession的id为:" + session.getId() + ",创建时间为:" +
new java.sql.Timestamp(session.getCreationTime()) +
",默认超时间隔为:" +
session.getMaxInactiveInterval() +
"session,最后一次访问服务器的时间为:" +
new java.sql.Timestamp(session.getLastAccessedTime()) +
",总在线时间为:" +
(session.getLastAccessedTime() - session.getCreationTime()) +
"ms,总存活时间为:" +
(System.currentTimeMillis() - session.getCreationTime()) +
"ms, 超时 : " +
(System.currentTimeMillis() -
session.getLastAccessedTime()) +
"毫秒");
Enumeration names = session.getAttributeNames();
while (names.hasMoreElements()) {
String name = (String) names.nextElement();
System.out.println("in session : "+ name + " == " + session.getAttribute( name));
}

}







sessionDestroyed tomcat4下确实不能用
所以我改用 HttpSessionBindsListener 觉得一般
tomcat4用的是servlet2.3 tomcat5用的是servlet2.4
我一直用weblogic8.1的还是2.3版本

servlet2.4 改后 sessionDestroyed 还是好用

不过知识研究 何以 多此一举?









public void finalize(){
System.out.println("回收 session end date="+date);
}

楼主真得多此一举 . 等待JVM 垃圾回收.


学习一下




to 楼主,

推荐你看一篇文章,servlet规范里已经提供了另外一种实现方式,
和你的方法类似,呵呵

我也是刚才才明白这几个接口的差异,看来得找时间仔细了解下 servlet 规范了。

http://tech.sina.com.cn/s/2005-05-24/1808616544.shtml





看了下
HttpSessionBindingListener 以前一直用的是这个 觉得这个不怎么好
以前要处理的日志比上面这个复杂多了
valueUnbound得不到session里的东西 不知道是不是servlet 2.3的BUG


servlet 2.4 完善后的HttpSessionListener 比较好
同时 继承 ServletRequestListener(2.4新增),HttpSessionListener
应该会实现一个很强的监听功能






漏了点
HttpSessionBindingListener
可以对 某个类 userinfo 在SESSION中的存活期进行监视

HttpSessionListener应该是不能吧?


学习一下!


HttpSessionBindingListener

HttpSessionAttributeListener好像作用有些重复吧


胡说八道,虚拟机的行为是不可预测的,
对象可以回收了和GC会将对象回收根本就是两回事,
千万不要把希望寄托在这个之上


↑返回目录
前一篇: hibernate的代码生成工具推荐
后一篇: 查询数据库的问题