关于SESSION中出现的奇怪的问题!高手进~~

TOMCAT5.0+SQL Server
用户登陆后,会将该用户有userID记录到session中,根据该用户所拥有的权限,可以对某些记录进行添加,修改等操作(在进入某条记录的时候,会把该记录的id号也记录到session中),现在问题是这样:用户在操作记录时,有时会出现session丢失的情况(相对于该客户机所有session都会丢失,但session ID是存在,并没有发生改变),这过程也没有将session值清空的代码,session 的 timeout时间为"-1"。
为这个问题在网上找相关资料也找了不少,问了别人也不少,都没有结果。听说这里高手如云,希望各位能解小弟燃眉之急!谢谢了

你将数据记录ID都记入Session,这是不对的,至少你包装一下吧。这是从设计角度考虑。

你使用sessionListener监视一下,看是否session.invalid是否被激活过。

回版主:
我用了你说的方法,在出现session值丢失的时候,sessionListener监听中的Attribute增加,替换,销毁三个事件中都没有这些事件的触发,也就是说session值莫明其妙的没了,这会是什么原因?头痛。。-_-!~

那么可能就是Session就没有产生过。

没有 前面几个页面 都打出这个session值 比如session.getAttribute("card") 是 12345678 但是过会经过几次操作后session.getAttribute("card")="" 是空了 而且sessionListener 监视的 attributeAdded、attributeRemoved、attributeReplaced 方法中 也没监听到变化,当然前提是这些都是同一个sessionID的,头痛死了!!!

哦 我在CSDN见到这种说法,我去找来把它贴出来 大家看看

不会出现这种情况,sessionListener 对象首先要你手工保存到session中,然后你在valuebound方法中打出log记录和sessionID,如果valuebound没有激活,说明你没有将sessionListener 对象保存到session的attribute中。

这是CSDN的帖子回复

回复人: riancoat(天黑黑) ( ) 信誉:100 2005-10-10 11:32:00 得分: 0


是你在页面转向时session在传值的过程中出现指针断裂

我用的是weblogic,我也碰到过这个问题 用的是IE浏览器,当时我们请了BEA的工程师,也没能解

决,初步断定是由于IE浏览器安全性控制引起的,

IE的安全性!!! 你换个浏览器试下 比如装个firefox,就应该没问题了

解决的办法到现在我也没找到~~~` 你换cookie试下,或者在转向的时候用jsessionid的方式明文传

过去

欢迎大家来交流: MSN:riancoat@hotmail.com QQ:3912630


package com.beltino.communitymedical.test;

import javax.servlet.http.*;

import org.apache.log4j.Logger;

import java.util.*;

public class SessionListener extends HttpServlet implements HttpSessionListener, HttpSessionAttributeListener {
static Logger appLog=Logger.getLogger(SessionListener.class);
private Date getNow(){
Calendar cal=Calendar.getInstance();
return cal.getTime();
}


//Notification that a session was created
public void sessionCreated(HttpSessionEvent se) {
appLog.info("创建了一个Session,SessionID=" + se.getSession().getId()+",时间为="+getNow());
}

//Notification that a session was invalidated
public void sessionDestroyed(HttpSessionEvent se) {
appLog.info("销毁了一个Session,SessionID=" + se.getSession().getId()+",时间为="+getNow());
}

//Notification that a new attribute has been added to a session
public void attributeAdded(HttpSessionBindingEvent se) {
appLog.info("Sessionid="+se.getSession().getId()+":增加了一个属性值,Name="+se.getName()+",Value="+se.getValue()+",时间为="+getNow());
}

//Notification that an attribute has been removed from a session
public void attributeRemoved(HttpSessionBindingEvent se) {
appLog.info("Sessionid="+se.getSession().getId()+":删除了一个属性值,Name="+se.getName()+",Value="+se.getValue()+",时间为="+getNow());
}

//Notification that an attribute of a session has been replaced
public void attributeReplaced(HttpSessionBindingEvent se) {
appLog.info("Sessionid="+se.getSession().getId()+":替换了一个属性值,Name="+se.getName()+",Value="+se.getValue()+",时间为="+getNow());
appLog.info("Sessionid="+se.getSession().getId()+":现在的属性值,Name="+se.getName()+",Value="+se.getSession().getAttribute(se.getName()));
}
}

web.xml中 加
<listener>
<listener-class>com.beltino.communitymedical.test.SessionListener</listener-class>
</listener>


然后session 的增加,销毁,sessionAttribute增加,替换,销毁,都是自动触发上面这个监视器里的方法

如果说是weblogic一个bug我可能相信,如果说用JBoss也会这样,那不是成了J2EE容器常见的bug?我就不相信了,我至今还遇到过邪门的事情,也就是没在技术上撞到鬼,虽然我想看到,每次我都撕开它的画皮了。

你使用另外一种方式,SessionListener 是继承BindListener,不作为一个单独的servlet,然后将这个SessionListener 加入session,模拟通常操作:session.setAttribute("xxx", SessionListener );这样valueBound会激活

好的,我去试试,再次谢谢您的关注

烈P注中大概在12月份要解QR的}!~

你用的是哪个版本的WLS,是不是没有打补丁?

前两天一直在搞这问题,对整个程序滤了一遍,突然发现所在程序的servlet,用了许多实例变量,恍然大悟,是不是这个导致线程不安全,引起丢失session呢,我改(是接收别人以前的项目),晚上总于吃饭钱搞定,立刻拿到客户那,装上,测,半小时过去了,没出现问题,高兴啊,吃饭去了,55555,可是。。。,可是。。。,吃了一半,电话响了,晕,又出来这问题了,我哭啊!~~~
再查,发现程序丢失session值后,即在也无法对该session进行任何操作,就是说sessionID存在,但对应该ID的内存好象无法使用了??百思不得其解啊??
查程序,发现该项目,有许多地方对session。setAttribute了,但没发现一处removeAttribute的,而且set的时候,有对象,数组,还有长长的SQL语句等。。。
现在我想问问,session的setAttribute 有没有长度限制,还有TOMCAT的session 到底能赋多大容量,如果超出会导致什么情况,往哪位大大帮我解道解道

maybe is your session time out.
我也遇过同样的问题。
但是后来发现,是session time out的问题。
因为同一个IE下,在重新连接Tomcat时,会得到同一个SessionID,可是那一是一个全新的session了。不知你的问题是不是着一个。