日期:2014-05-17  浏览次数:20683 次

关于表单重复提交的一个小疑问

表单重复提交的实现是:
1.在显示提交页面的时候是通过servlet或action转发后显示的,此时页面中有一个隐藏域存放servlet或action中设置的唯一标识
2.并且这个唯一标识在session中也存放了一个一样的。
3.当表单提交到一个servlet或action的时候,servlet或action会将页面中的唯一标识和session存放的唯一标示进行对比,
如果相同则将session里的唯一标示删除,并且往下执行增加数据操作,
如果不同则返回给用户信息重复提交的提示。


基于一个例子:
  当用户点击一个增加用户的超链接,页面跳转到一个增加用户页面,当成功添加数据后,点击后退再提交(不管数据改没改)和刷新都是不能再成功写入数据库了。但是重新点击超链接填写完数据后可以再添加用户。

小弟到这里有一个疑问:
  session是浏览器一连接到服务器就建立的,那么只要用户不关闭浏览器再进行连接的话,用的都是同一个session。那么在上面的第3个步骤中所执行的操作,(如果表单隐藏域中的唯一标示和当前session里存放的唯一标识一致的话则删除session中的唯一标识)不是会导致点击那个增加超链接也不能正常添加了么?因为session都是同一个并没有创建新的。
  可是实际结果却是当点击增加用户超链接填写完数据可以再次添加数据,也没有关闭浏览器重新打开。


求大神

------解决方案--------------------

貌似看懂了你的需求,你就是要在新增用户的时候控制一下不能反复提交到后台处理是吧,我之前也碰到这样的问题,我的解决方案是:点击之后灰掉按钮 不能重复点击<input type="button" disabled="true"/>
还可以根据action 或者 servelt获取到用户名到数据库查询,如果有了则提示用户不能多次提交,还可以根据一种方式既是:令牌,具体可以百度下 也是和session有关。
------解决方案--------------------
防止重复提交仅仅针对于表单提交。单击超链接不必添加唯一标识,也不必进行过滤。
只在表单中添加隐藏域,过滤器或拦截器只会过滤或拦截表单提交。
其他情况不添加隐藏域,也没有过滤器或拦截器。
因此这种方式是完全行得通的。