`
cuiyadll
  • 浏览: 197238 次
文章分类
社区版块
存档分类
最新评论

有了上一篇博文,类似地顺便说说表单防重复提交。

阅读更多
    表单防重复提交,老鸟略过。做过web的应该都知道,当submit一个表单后,再按浏览器的刷新(F5),表单会再次提交,这样并不是我们想看到的。看了一下华佗的网站,他用的是token机制防重复提交(方法如下:进入页面之时,随机一个数值,可以是Math.random(),也可以是取当前时间…等等。将这个值放入session.setAttribute("token",刚才的随机值),同时也放入表单的一个隐藏文本域<input type=hidden name=token value=刚才的随机值/>。当用户提交的时候,后台首先判断session中的token和表单中的token是否一致,如果相同,则移除session.removeAttribute("token"),允许提交。待用户F5刷新的时候,就不一致了,则说明是重复提交。)不知道这样说,大家能不能明白。

    有人就可能会问了,为啥刷新浏览器,会导致表单的重复提交呢?带着这个问题,我们寻求一个更简单的方式,来防止重复提交。(假设表单页为A.jsp,处理添加数据.并查询数据servletB,处理完forward到C.jsp展示所有数据。)按照这样的写法,在跳到C后,按F5,肯定是会重复添加数据的。首先,让人想到的是将forward改为redirect,重定向。这样的确不会重复提交了,但是新问题又来了:C中显示不了数据,因为重定向后,request就拿不到B查询的数据了。好,我们又会想到,B中,用session存储查询好的数据。嗯,不得不承认,这样的确也达到了效果,不过session这玩意,听说要少用。所以,我们不能就此罢休!最后总结了一个比用token方便,也不用session来存数据,的方案:(把servletB删掉,拆成两个servlet:X(负责添加)和Y(负责查询),思路:A->[提交]->X->[重定向]->Y->[请求转发]->C)按照这样的步骤,C能拿到Y查好的数据,而且F5刷新,也不会重复提交(因为多了一步X->Y的操作)。
分享到:
评论
1 楼 men_clslji 2013-10-15  
按照目前的方法只是防止刷新页面时不再执行X(添加),而token的运用主要还有一点是在网络不理想情况下。
用户多次点击提交按钮,结果是第一次还没响应,也就是还没重定向到Y(查询)时,就再次请求了X(添加)。
使用token就可以很好的避免了此问题,同一页面的请求能保证只执行一次。

相关推荐

Global site tag (gtag.js) - Google Analytics