| 本页主题: struts1 动态form session过期后,里面的数据居然还存在!请大家伙指点迷津 |
|
| |
|
泡妞而来

积分:60
发表主题:56
|
| 发表于 2009-06-23 17:14 资料 |
楼主 |
正在维护一套系统,使用的是struts1,form为动态form,系统使用了过滤器,在web.xml中做了如下设置 <filter-name>loginFilter </filter-name> <filter-class>zhongliang.servlet.LoginFilter </filter-class> <init-param> <param-name>startsWith </param-name> <param-value> /Login.jsp, /loginAction.do </param-value> </init-param> </filter> 在这个过滤器中进行处理时,如果访问的url中包含上述设置中的值,就不进行拦截,其他都要拦截, 当用户登录时(访问login.jsp),会调用loginAcion.do,在loginAction中有如下代码 public class LoginAction extends DispatchAction { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)throws Exception { DynaActionForm myForm = (DynaActionForm)form; Map map = myForm.getMap(); String loginName = map.get("loginName").toString().trim(); String password = map.get("password").toString().trim(); ………………………… LoginAction 处理完毕后 ,会导向一个home.jsp页面,该页面显示的url是: http://localhost:7001/epare/loginAction.do 我的session过期时间设置为2分钟(测试时),当2分钟后,访问系统其他页面,会显示重新登录页面,但是当再次刷新home.jsp这个页面时居然没有出现提示重新登录页面,我知道,因为url中含有loginAction.do,所以过滤器没有拦截,会再次访问LoginAction.do,此时我的理解是session过期了,myForm 中不应该还有loginName和password值,结果却发现仍然有值!结果导致home.jsp能正常访问,其他页面也能了,这可不是我想要的结果啊,请高人帮忙指点迷津 回复1: 用struts令牌机制 登陆时在页面用savetoken方法,在接受请求页面用istokenvalid(request,false)接收判断 可以防止恶意登陆 回复2: 我这里不是恶意登录,我想解决的问题是,为什么session过期,动态form的里仍然保留以前登录的值~,如何解决这个问题。比如对于登录后显示的home.jsp我们是允许不断刷新的,不存在恶意登录的问题 回复3: 在你登录页面home.jsp设置一下 session.removeAttribute("username"); session.invalidate(); 回复4: 遇到过类似的问题,不记得怎么解决了. 回复5: Ami121,如果这么设置了,当用户刷新这个页面时,即在session没过期得时候刷新,他会看到你没有登录的信息,这样他就会打电话到他们的信息中心,然后信息中心就会对我开始破口大骂的……
回复6: 重定向行不行,重定向后session应该不发生变化吧 回复7: 判断当过期的时候就自动弹重新登陆页面或者清空session 回复8: 没有看清楚你的页面跳转 只要session过期就要跳转到login.jsp 在login.jsp页面设置 session.removeAttribute("username"); session.invalidate(); 回复9: 唉,重定向不行啊,因为在登录的action中做了大量的操作,都放到了request中去了,重定向后所有的值全丢失了,不行啊 回复10: Ami121,这个判断session过期,怎么判断啊?
回复11: 依据你的思路从home.jsp跳转到login.jsp if(null==session.getAttribute("username")){ System.out.println("session取不到username的值,认为session已经过期了") }else{ System.out.println("从home.jsp跳转到login.jsp不管session是否渠道sername的值,都认为session已经过期了") session.removeAttribute("username"); session.invalidate(); } 具体怎么来实现 你自己本身可以规定
回复12: 哦, 怨我没说清楚,是这样的,是从login.jsp ,跳转到loginAction.do,然后在这个action中系统做了大量的操作,把很多数据放到了request和session中,然后跳转到了home.jsp,这时,虽然显示的是home.jsp,但是url其实显示的是loginAcrtion.do,系统的过滤器在判断访问的url时,如果url中有loginAction.do那么就放行,因为不放行的话,login.jsp提交的数据没法进行验证了,放行的标准就是,看看session过没过期,过期了就要求重新登录。现在的问题是,当session已经过期了,其他页面都访问不到了,但是刷新home.jsp它仍然能运行,因为url里是loginAction.do,我疑惑的是,这个loginAction.do中是要访问动态form的,session都过期了,这个动态form中的值,为什么还存在,即一开始登录提交的loginName和password还存在,所以还能正常跳转到home.jsp,google了好多都不行啊,郁闷
回复13: <action path="" name="你的form" scope="request"> </action> scope修改成request看看
|
|
|
|
|