Struts2里使用Token

1注册页面(提交注册信息)2出错页面(用户名重复),点击返回注册页面,表单没有刷新,再填写信息提交注册,提示已重复提交,
由于在ACTION里跑了1遍,SESSION里重新生成了Token值,而页面并没有,所以重复提交了,怎么解决这个问题呢
??

返回的时候,不用javascript的history.back()去跳,可以用页面跳转去解决——经过struts的控制去跳转

你在验证用户名是否存在是!应该用Ajax异步提交方法!这样就可以避免了!还有一种方式就是用Frame框架做呀!哈哈!

/s:token在jsp页面的form里面加上
注意:要先访问到这个jsp页面,来给token初始的值,这样当你提交的时候,才能匹配上

刚进入jsp页面的时候,struts2会生成一个tokenid的字符串,然后存入session。当点击提交按钮的时候,struts2把页面的tokenid回传到struts2的拦截器里,看看是否一样,一样的话,就在给tokenid赋个新值,然后传回表单,当再点击提交或者刷新的时候,又执行上面的过程,结果session中的tokenid和表单中的不一样,就出错




/jsp/repeatRefresh.jsp
/jsp/Person.jsp
/jsp/Person.jsp

上面的invalid.token默认是不一致时候的result,这样就返回到repeatRefresh.jsp页面,在这里给出提示,比如:不能重复提交等等

别忘了在页面的form里加上 /s:token,可以查看源代码,就能找到tokenid的值

我觉得楼上说的原理好像有些问题。

在页面加载时,产生一个GUID(Globally Unique Identifier,全局唯一标识符)值的隐藏输入框如:



同时,将GUID放到会话(session)中;在执行action之前,“token”拦截器将会话token与请求token比较,[color=darkblue]如果两者相同,则将会话中的token删除并往下执行[/color],否则向actionErrors加入错误信息。如此一来,如果用户通过某种手段提交了两次相同的请求,两个 token就会不同。

标签有个name的属性,可以用来明确指定保存在session中的GUID的名字,如:,则会把该token以"token"放到session中,可以在action中通过 session.getAttribute("token");来取得.如果不指定,默认的名字是struts.token.

生成新的值或者是删除了session里的token,是正确的,这样,你那个没有刷新的页面上的token和session里的不一样,struts应该就认为是你重复提交,我不知道你为什么想让他不生成亲的token呢?

新生成的TOKEN值发到了我的error.jsp页面
难道你的error.jsp里也加了token标签吗? 这里加这个没有任何意义。他无论怎么刷这个error.jsp页面,就让他随便搞吧。

返回注册页面提交注册 就是重复提交了
我不知道你是怎么返回的?是不是link到那个action返回的,你如果这样返回struts是没有办法的,同时也已经刷新了页面了吧? 如果刷新了,自然就会重复生成token了。因为这时已经无法区别你这是新页面,还是重复提交的。一般重复提交是用后退按钮来到达到注册页面,然后再按提交按钮,或者是快速按了两次提交按钮,这种情况才能认为是重复提交呢。