MyException - 我的异常网
当前位置:我的异常网» Java Web开发 » 心急如焚啊再次提问,session过期后,为什么数据还

心急如焚啊再次提问,session过期后,为什么数据还存在?该怎么解决(2)

www.MyException.Cn  网友分享于:2015-08-27  浏览:23次

------解决方案--------------------
呃…… 之前看过servlet规范,就算session过期,如果使用该session的所有的servlet service()方法没有执行完毕,那么过期时间的无效化就不会产生作用。恐怕楼主要研究一下DispatchAction中的源码才能找到满意的答案了。还有String key = session.getId(); 这条语句也让人在意,因为后面将其引用到了servletcontext。不知道有没有影响。哈哈。说的话跟没说的一个样。
------解决方案--------------------
在JSP页面加下面清除缓存代码试下看看:
<%
response.setHeader("Pragma", "No-cache"); 
response.setHeader("Cache-Control", "no-cache"); 
response.setDateHeader("Expires", 0);
%>
------解决方案--------------------
刷新的时候,你之前post提交的数据也会再次提交,当然可以取到用户名和密码了。

------解决方案--------------------
刷新一下,就重复提交一下之前那个表单。所有你得用令牌来阻止重复提交.
------解决方案--------------------
探讨
刷新的时候,你之前post提交的数据也会再次提交,当然可以取到用户名和密码了。

------解决方案--------------------
刷新的时候,你之前post提交的数据也会再次提交

恩,这个结论有道理。url地址中存在用户名和密码,刷新后相当于重新登录。
------解决方案--------------------
刷新一下页面,相当于重新提交了一次登陆请求(loginAction.do),你可以使用struts的validate.或者打开首页为重定向方式。
------解决方案--------------------
学习中,
------解决方案--------------------
学习
------解决方案--------------------
study
------解决方案--------------------
study

------解决方案--------------------
刷新就是重新提交了表单,再次登录了,当然新的session产生了!
------解决方案--------------------
原因很简单,因为楼主使用Forward方式重定向.
Forward的特点是:
请求过程中使用同一个request对象.

既然是同一个request对象,自然登录时使用的用户名和口令也保存在登录后的请求中

此时刷新,会使用上次的表单信息进行form的submit动作,自然就相当于重新登录了

解决的办法有两种:
1.使用struts的"令牌"机制,这个机制是专门用来解决重复的数据提交问题的
2.简单的使用response对象的sendRedirect方法取代forward方法,重定向到首页

redirect会使用新的request对象发起请求,之前提交的表单数据全部失效,自然就不会再有问题了.
------解决方案--------------------
如果用户对一个html表单多次提交,web应用应该能够判断用户的重复提交行为,并作出相应的处理。 

最常见的是新增一条数据,用户已经提交表单并且服务器端已经完成新增成功。此时用户可能有两个误操作: 
1.用户通过浏览器的后退功能,返回到录入页面,重复提交(此时浏览器提供回退功能基本上是个邪恶行为) 
2.刷新该页面(因为新增成功的提示页面通常是通过请求转发(forward)过来的,所以此操作实际效果通常等同于1) 

这样造成的可能结果有: 
1.若程序级别和数据库级别限制了重复记录,会提示类似于“xxx字段已存在,请修改后重新保存”的信息 
2.若没有此限制,服务器端会再插入一条数据,而这通常不是用户想要的 

误操作2和可能结果2的结合就达成了与用户意图相背的结果:服务器端不停地在增加重复记录,用户认为自己只不过是刷新该提示信息页面。 

通用的解决思路是: 
用户请求录入页面,这个与服务器建立的一次连接过程中,在服务器端①【生成一个session标识,同时返回到客户端一个与此匹配的hidden域】。用户提交了此页面,服务器端首先②【判断此hidden域与session标识是否匹配】,若不匹配,终止保存操作,提示同一表单不能提交两次,同时①【新建一个session标识和hidden域】,返回录入页面;若匹配,执行插入保存操作,同时③【清空(重置reset)session标识】。 

Struts正在基于这样的思路在org.apache.struts.action.Action类中提供了内置支持方法: 
java代码: 

protected void saveToken(HttpServletRequest request) 配合标签对应于① 
protected boolean isTokenValid(HttpServletRequest request) 对应于② 
protected void resetToken(HttpServletRequest request) 对应于③

这样我们在写程序的时候,结合Struts的html标签,只要 
1.在forward到insert.jsp页面前加一个action执行saveToken(request)操作,或干脆在insert.jsp中写 
2.保存前加个判断操作isTokenValid(request) 
3.若isTokenValid(request)返回false,执行saveToken(request)操作,返回错误提示页面;true则执行resetToken(request)操作,然后进行实际的保存操作


Java code

文章评论

软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有