Tomcat在重新加载后Session内容会自动清掉的问题

yangcl 2004-12-27 11:08:02
在Tomcat的配置文件中允许reload变动的class,这样做很方便
不用每次都重新启动Tomcat了,可以随之带来的问题是,
每次tomcat reload 新的class,都会将JSP页面保存的Session信息都清除,
所以如果Session保存一些JSP/Servlet中需要的信息的话,就会取不到
必须要经过重新登陆或其他方法重新加载Session,感觉这样还是挺麻烦的
不知谁知道如何配置Tomcat能让他的Session在reload之后不掉,谢谢!
...全文
285 点赞 收藏 15
写回复
15 条回复
daihf 2005年01月11日
回复 点赞
yangcl 2005年01月11日
论坛是一个让人提问题的地方,遇到问题的时候,不是每个人都需要把这个问题的前前后后都搞得很清楚,
每个人做项目的关注点有很大不同,你可能这次用到Hibernate,要关注技术,
下次也许就要关注分析复杂的业务流程,甚至做BPR,
当然如果你只是个简单的Developer,更需要花时间关注基础的软件工程或者是CMM或者XP类的软件管理

我一开始只是简单抱怨一句“难道CSDN就没有知道的了?晕!”,加了一点点个人情绪,仅此而已
相信没有说什么过分的话,可楼上的那位不知道怎么影响到你了,说这么多,加了更多的个人情绪,是否如果我继续下去,这个帖子就会变成互相攻击的垃圾贴?虽然csdn我很少来,但也不希望是这样子的

看你已经有了5颗星,应该是CSDN里的老手了,我相信你比我更应该在这个技术论坛里改善论坛风气,帮助别人,对么?
回复 点赞
zxjcool 2005年01月11日
s_phoenix() 的话很有道理,好像还与tomcat的版本有关吧,最好是5.0以上版本
回复 点赞
joyaga 2005年01月11日
顶了 楼上 我也参考的那本书
回复 点赞
s_phoenix 2005年01月11日
哦,忘记说最关键的了。
关闭服务和启动服务,一定不能使用windows下的图形界面程序!就是那个config tomcat。我最初就是害在它的手下,始终不能成功。
后来无意间才发现,只有用脚本启动/停止服务,或者通过TOMCAT的WEB管理页面启动/停止服务,才会正常实现session的持久化!
回复 点赞
s_phoenix 2005年01月11日
楼主,我来告诉你吧!!
你的愿望是可以达成的。因为tomcat本身就支持这样的功能。它可以在服务关闭时,将当前的session写入到文件或者是数据库中(依据你在server.xml中的配置)。然后在服务重启后,自动将保存的session读取到内存中。
我前端时间也问过同样的问题,结果论坛上的人都说不能实现,最后还是我自己测试成功了。
我最初是在《TOMCAT与JAVA WEB开发技术详解》看到这个部分的,叫做session的持久化。
具体代码如下:(注意,我这里只贴出了持久化到文件的实现方式,持久化到数据库的你可以发信问我,或者买书看看)
<Context path="/helloapp" docBase="helloapp" debug="0"
reloadable="true">

<Manager className="org.apache.catalina.session.PersistentManager" >
debug=0;
saveOnRestart="true"
maxActiveSessions="-1"
minIdleSwap="-1"
maxIdleSwap="-1"
maxIdleBackup="-1"
<Store className="org.apache.catalina.session.FileStore" directory="mydir" />
</Manager>

</Context>

maillogin.jsp:
<%@ page contentType="text/html; charset=GB2312" %>
<%@ page session="true" %>
<html>
<head>
<title>helloapp</title>
</head>

<body bgcolor="#FFFFFF" onLoad="document.loginForm.username.focus()">

<%
String name="";
if(!session.isNew()){
name=(String)session.getAttribute("username");
if(name==null)name="";
}
%>
<p>欢迎光临邮件系统</p>
<p>Session ID:<%=session.getId()%></p>
<table width="500" border="0" cellspacing="0" cellpadding="0">
<tr>
<td>
<table width="500" border="0" cellspacing="0" cellpadding="0">
<form name="loginForm" method="post" action="mailcheck.jsp">
<tr>
<td width="401"><div align="right">User Name: </div></td>
<td width="399"><input type="text" name="username" value=<%=name%>></td>
</tr>
<tr>
<td width="401"><div align="right">Password: </div></td>
<td width="399"><input type="password" name="password"></td>
</tr>
<tr>
<td width="401"> </td>
<td width="399"><br/><input type="Submit" name="Submit" value="提交"></td>
</tr>
</form>
</table>
</td>
</tr>
</table>


</body>
</html>

mailcheck.jsp:
<%@ page contentType="text/html; charset=GB2312" %>
<%@ page session="true" %>
<html>
<head>
<title>
checkmail
</title>
</head>
<body>

<%
String name=null;
name=request.getParameter("username");
if(name!=null)session.setAttribute("username",name);
%>

<a href="maillogin.jsp">登录</a>   
<a href="maillogout.jsp">注销</a>   
<p>当前用户为:<%=name%> </P>
<P>你的信箱中有100封邮件</P>

</body>
</html>
服务启动后,访问http://127.0.0.1:8080/helloapp/maillogin.jsp,输入名字后转到mailcheck.jsp,然后停止服务,此时,在%CATALINA_HOME%/work/catalina/localhost/helloapp/出现了指定的mydir目录,目录下出现存放具体session内容的文件。再次重启服务,从mailcheck.jsp转回maillogin.jsp(点击登录),页面出现通过session保存的姓名。也就是说,session持久化成功
回复 点赞
dkmilk 2004年12月30日
这是一种学习的态度,也是学习的方法,提任何问题你都要考虑后再提,
就好比你提的这个问题。是关于session的,你首先应该找些session的资料,把session的工作原理搞明白,那样你的问题就自己就明白能不能实现,自己就解决了。而且以后你遇到session方面的东西就都明白了。不要动不动一个小问题,不自己思考学习就来问。就是别人回答了你。你这个小问题明白了。以后的session方面的问题你一样不明白,
再者你的这个问题要说明白,就一定要了解session的运行机制。

我最讨厌问个问题没人回答就乱叫
回复 点赞
yangcl 2004年12月30日
难道CSDN就没有知道的了?晕!
====================
最反感这样的话


你把session的原理搞明白,就不会问这个问题了、
============================

最讨厌这种回答问题的态度,呵呵,你如果了解的话就请赐教,
不了解的话,说这种话也没有任何帮助呀

csdn毕竟是国内一个入门级程序员交流的一个论坛,还是太浮躁
回复 点赞
dkmilk 2004年12月28日
难道CSDN就没有知道的了?晕!
====================
最反感这样的话


你把session的原理搞明白,就不会问这个问题了、
回复 点赞
yangcl 2004年12月28日
难道CSDN就没有知道的了?晕!
回复 点赞
z3h 2004年12月27日
应该是所有的web容器都是这种机制的。为了保证 数据的一致性 。
回复 点赞
yangcl 2004年12月27日
cookie只是实现Session的细节
Tomcat是用cookie实现Session的,但是.Net就不一定这根Session失效好像没有关系把
回复 点赞
jcw2016 2004年12月27日
"在Tomcat的配置文件中允许reload变动的class,"

在哪里配置的啊?
回复 点赞
jFresH_MaN 2004年12月27日
没考虑过cookie?
回复 点赞
yangcl 2004年12月27日
默认的情况以应该是这样,难道就不能控制么?
回复 点赞
发动态
发帖子
Java EE
创建于2007-09-28

3.7w+

社区成员

22.5w+

社区内容

J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区公告
暂无公告