想实现功能:只要网页不关闭,session永远不过期;
实现方法:
1.在系统主页中,加入一个iframe,引用刷新页面:
<iframe id="iframe_00" frameborder="no" border="0" style="width:0;height:0" src="/html/refresh.jsp"></iframe>
2.刷新页面的内容如下,每15分钟重新刷新一次,加载本页面;
refresh.jsp的内容如下:
<html>
<head>
<title>refresh</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script type="text/javascript">
function _refresh(){//alert('test');
window.location.reload();
}
var timer = window.setTimeout(_refresh,15*60*1000);
</script>
</head>
<body>
<%
String uid=cn.com.web.SessionHelper.getSessionUserId(request);
//System.err.println("session user id == "+uid);
%>
</body>
</html>
问题:
1.刷新页面肯定有执行,我有打印出内容查看,打印出来的登录名也是正确的;
2.系统到了web.xml中设定的session失效时间后,session依然失效,跳转到登录页面;
<session-config>
<session-timeout>300</session-timeout>
</session-config>
真是找不到解释的理由了,,大家帮我看看....
谢谢
问题补充:
针对各位朋友的答案:
补充一下::
1.我详细对比了比的请求的sessionId,值是一样的;
2.我单机服务器使用的是weblogic814,不会产生这种问题;
3.部署到生产机,,使用weblogic814集群,有两台服务器,才产生失效的问题;
4.加入以下测试代码:
long last=session.getLastAccessedTime();
long now=new java.util.Date().getTime();
int max=session.getMaxInactiveInterval();
java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.err.println("MaxInactiveInterval=="+session.getMaxInactiveInterval()+" LastAccessedTime=="+sdf.format(new java.util.Date(last))+" now time=="+sdf.format(new java.util.Date(now))+" invaid time == "+(max-((now-last)/1000)));//个人认为,最后一个时间是,离session失效的时间.,打印出来的结果是,,还需要115秒才失效,,可是,,前台已经失效了;
打印出的结果是:
>>MaxInactiveInterval==120 LastAccessedTime==2009-01-07 15:33:19 now time==2009-01-07 15:33:25 invaid time == 115
>>MaxInactiveInterval==120 LastAccessedTime==2009-01-07 15:33:25 now time==2009-01-07 15:33:30 invaid time == 115
>>MaxInactiveInterval==120 LastAccessedTime==2009-01-07 15:33:30 now time==2009-01-07 15:33:35 invaid time == 115
>>MaxInactiveInterval==120 LastAccessedTime==2009-01-07 15:33:35 now time==2009-01-07 15:33:40 invaid time == 115
>>MaxInactiveInterval==120 LastAccessedTime==2009-01-07 15:33:40 now time==2009-01-07 15:33:45 invaid time == 115
>>MaxInactiveInterval==120 LastAccessedTime==2009-01-07 15:33:45 now time==2009-01-07 15:33:50 invaid time == 115
>>MaxInactiveInterval==120 LastAccessedTime==2009-01-07 15:33:50 now time==2009-01-07 15:33:55 invaid time == 115
还没有答案,,,真是奇怪...
问题补充:
<session-config>
<session-timeout>300</session-timeout>
</session-config>
单位应该是,分钟,,,300/60.应该5小时.?
问题补充:
不好意思,,,为了做测试::
我现在改了配置文件,,,以上的打印结果是基于新配置文件的...
<session-config>
<session-timeout>2</session-timeout>
</session-config>
//2分钟
function _refresh(){
window.location.reload();
}
var timer = window.setTimeout(_refresh,5*1000);
//5秒钟刷新一次
说明一下,,后来的打印一却都是自己需要的结果,,,打印的都是正确的....
但是,,2分钟时间到了,,照样跳转出登录页面;
集群,session复制问题:
集群我不太熟悉,,是别的公司配置的,,采用的是array,,(我没用过,呵呵,,一点不懂),,,,他现在的算法是,,一个IP,一定时间内的访问都固定在一台服务上,,这样想过去,,应该不存在session复制问题.,
问题补充:
集群,使用Array的负载均衡.
因为客观原因,分流配置是别的公司做的..
我们这里不太了解这个东西..
要沟通,,需要找比较有效的证剧,,证明和它们有关系,,,比较麻烦..
问题补充:
他们采用的算法是,,
比如,,A IP 这次访问请求,,在此10小时内访问,,都是固定在server 1,,
没有session 的复制,,,减小系统开支..
照这样看的话,,应该就不存在因为服务器session不同步而产生这个问题,,
日志的打印结果也证明,,打印的内容,,比如保存在session中的用户的登录账号,,一直都是正确的...
问题补充:
这个可以肯定,,确实随机访问了其中一台服务,,直到这个这个请求终止,,都是这台服务在响应.
问题补充:
2.在服务器测试,看是否只有Array的情况下有问题;
3.如果不是Array也有问题,那就是集群的配置问题;
本地是没问题的;
array,和集群问题因为不熟悉,不好测试,,
单起一台服务也是会超时;
问题补充:
写JS刷新效果是一样的,,
到于改session周期,,真是一言难尽,,,不知道改多大为好..
这样的需求属于客户要求问题,,我改了5小时了,,,他一晚上不关机,,,照样超时,,我要是改成12小时,,,他要是周未不关机怎么办??
那我总不能改成无穷大吧????
想不明白呀,,,不知道怎么调试了....
问题补充:
问题解决:原因是系统中引用了第三方的JAR包,跟踪后,发现这个JAR包中有个方法会在session超时时间到后,,自动去清除会话,而不管你这个session的last access time....
将这个JAR包去除后,,,系统正常....
具体原因还是不清楚,,感觉不可思议.....
为什么本机开发的时候不会出这个问题呢???weblogic的部署模式有关系吗???
是和操作系统有关系吗?
待以后了解...