1. 表单重复提交的情况
1)在表单提交到一个servlet,而servlet又通过请求转发的方式响应了一个 JSP(HTML)页面,此时浏览器地址栏还保留着 servlet 的那个路径,在响应页面点击“刷新”。
2)在响应页面没有到达时重复点击“提交按钮”
3)点击“返回”,在点击“提交按钮”
2. 不是重复提交的情况
点击“返回”,“刷新”原表单页面,再点击“提交”。 此时相当于重开一个页面
3. 如何避免表单的重复提交
在表单中做一个标记,提交到servlet时,检查标记是否存在且和预定义的标记一致,若一致,则受理请求并销毁标记;若不一致或没有标记,则直接响应提示信息:“重复提交”
① 仅提供一个隐藏域:不中!
<input type="hidden" name="token" value="tokenValue" />
此方法行不通:没有方法清除固定的请求参数
② 把标记放在request中。不中!
行不通:因为表单被刷新后,request已经被销毁,再提交表单是一个新的request
③ 把标记放在session中,中!
在原表单页面,生成一个随机token。比如:new Data()
在原表单页面,把token值放入session中
在原表单页面,把token值放入隐藏域中
.
在目标的servlet中:获取session和隐藏域中的值
比较两个值是否一致,若一致则受理请求,且把session域中的 token属性清除
若不一致,则直接响应提示页面:“重复提交”