表单的重复提交

1). 重复提交的情况: 
①. 在表单提交到一个 Servlet, 而 Servlet 又通过请求转发的方式响应一个 JSP(HTML) 页面, 
此时地址栏还保留着 Serlvet 的那个路径, 在响应页面点击 "刷新" 
②. 在响应页面没有到达时重复点击 "提交按钮". 
③. 点击 "返回", 再点击 "提交"

2). 不是重复提交的情况: 点击 "返回", "刷新" 原表单页面, 再 "提交"。

3). 如何避免表单的重复提交: 在表单中做一个标记, 提交到 Servlet 时, 检查标记是否存在且是否和预定义的标记一致, 若一致, 则受理请求,
并销毁标记, 若不一致或没有标记, 则直接响应提示信息: "重复提交" 

①. 仅提供一个隐藏域: . 行不通: 没有方法清除固定的请求参数. 
②. 把标记放在 request 中. 行不通, 因为表单页面刷新后, request 已经被销毁, 再提交表单是一个新的 request.
③. 把标记放在 session 中. 可以!

    > 在原表单页面, 生成一个随机值 token
    > 在原表单页面, 把 token 值放入 session 属性中
    > 在原表单页面, 把 token 值放入到 隐藏域 中.

    > 在目标的 Servlet 中: 获取 session 和 隐藏域 中的 token 值
    > 比较两个值是否一致: 若一致, 受理请求, 且把 session 域中的 token 属性清除
    > 若不一致, 则直接响应提示页面: "重复提交"

你可能感兴趣的:(Javaweb,Javaweb)