原理:
Struts的Token机制能够很好的解决表单重复提交的问题,基本原理是:服务器端在处理到达的请求之前,会将请求中包含的令牌值与保存在当前用户会话中的令牌值进行比较,看是否匹配。在处理完该请求后,且在答复发送给客户端之前,将会产生一个新的令牌,该令牌除传给客户端以外,也会将用户会话中保存的旧的令牌进行替换。这样如果用户回退到刚才的提交页面并再次提交的话,客户端传过来的令牌就和服务器端的令牌不一致,从而有效地防止了重复提交的发生。
这时其实也就是两点,第一:你需要在请求中有这个令牌值,请求中的令牌值如何保存,其实就和我们平时在页面中保存一些信息是一样的,通过隐藏字段来保存,保存的形式如:〈input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="6aa35341f25184fd996c4c918255c3ae"〉,这个value是TokenProcessor类中的generateToken()获得的,是根据当前用户的session id和当前时间的long值来计算的。第二:在客户端提交后,我们要根据判断在请求中包含的值是否和服务器的令牌一致,因为服务器每次提交都会生成新的Token,所以,如果是重复提交,客户端的Token值和服务器端的Token值就会不一致。
源文档 <http://ww1.blog.enorth.com.cn/article/13871.shtml>
步骤:
1.在用户通过Action到达表单提交页面的时候,首先在这个action中调用一下 this.saveToken(request);
2.在用户提交表单时候传入一个隐藏域 ,跟随表单一起提交
<input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value='<%=session.getAttribute("org.apache.struts.action.TOKEN")%>' />
3.在处理用户提交请求的action 中
HttpSession session = req.getSession();
String token = req.getParameter("org.apache.struts.taglib.html.TOKEN");
String token2 = (String) session.getAttribute(org.apache.struts.Globals.TRANSACTION_TOKEN_KEY);
System.out.println("token:"+token);
System.out.println("token2:"+token2);
session.removeAttribute(Globals.TRANSACTION_TOKEN_KEY);
if (StringUtils.isNotBlank(token) && token.equals(token2))
{
req.setAttribute("message", "成功提交!");
return mapping.findForward("success");
}
req.setAttribute("message", "重复提交!");
return mapping.findForward("error");
分享到:
相关推荐
防止重复提交的总要解决方案 相信对struts的学者有帮助 大家看看
造成重复提交主要的两个原因: 1) 一是,服务器处理时间久。当用户在表单中填完信息,点击“提交”按钮后,由于服务器反应时间过长没能及时看到响应信息,或者出于其它目的,再次点击“提交”按钮,从而导致在...
这里是Struts2 中放置表单重复提交的例子。
struts2 防止 重复 提交 和 等待 画面
struts2防止表单重复提交,利用struts的拦截器tokenSession,轻轻松松解决表单重复提交的问题。 附件为源代码,后台延迟了3秒,可直接在web服务器下部署运行,输入用户名和密码后,多点几次提交按钮,然后看控制台...
struts2防止重复登录,分享给大家学习一下。
Struts2 防重复提交Demo 利用Struts2自带的s:token写的防数据重复提交策略.
struts2防止表单重复提交--重定向
客户端跳转时用HttpservletResopse对象的sendRedirect函数实现,服务器端跳转是使用RequestDispather对象的forward方法实现的。这两者之间的区别主要体现在三个方面.......
【原创】Struts2防止表单重复提交.doc
JavaEE Struts2利用tokenSession防止重复提交
由于struts2标签的性能不好,但是如果用struts2自带的拦截器防止重复提交又必须struts标签,所以只好自定拦器实现
由于struts2标签的性能不好,项目组决定不使用,但是如果用struts2自带的拦截器防止重复提交又必须struts标签,所以只好自定拦器实现
防止表单重复提交 token eclipse项目
NULL 博文链接:https://clw.iteye.com/blog/301343
自己写的一个简单地利用struts2实现的登陆项目 另外附有拦截器防止重复提交 希望能对初学者有很所帮助
在点击"提交"后,我们通常会弹出一个提示信息的页面,用户此时有可能会按f5刷新当前提交的action,从而将多个相同的数据保存到了后台数据库,并且造成了潜在的安全危险! 如何避免重复提交呢?
专门为struts打造的,有效的防止重复提交,并且操作起来相当方便……
Struts2自定义拦截器实现防止重复提交