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

阅读更多
    表单防重复提交,老鸟略过。做过web的应该都知道,当submit一个表单后,再按浏览器的刷新(F5),表单会再次提交,这样并不是我们想看到的。看了一下华佗的网站,他用的是token机制防重复提交(方法如下:进入页面之时,随机一个数值,可以是Math.random(),也可以是取当前时间…等等。将这个值放入session.setAttribute("token",刚才的随机值),同时也放入表单的一个隐藏文本域。当用户提交的时候,后台首先判断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的操作)。

你可能感兴趣的:(servlet,web)