表单的重复提交
- 表单的重复提交
1).重复提交的情况:
①在表单提交到一个Servelt,而Servelet又通过请求转发的方式响应了一个JSP(HTML)的页面,此时地址还保留着Servlet的那个路径,在响应页面点击刷新:
②在响应页面没有及时到达时重复点击“提交按钮”,则会重复提交数据
③点击“返回”,再点击“提交”如果刷新了页面则不是重复提交
- 如何避免表单的重复提交:再表单中做一个标记,提交到Servlet时,检查是否存在和预定义的标志一致,若一致,则受理请求则销毁标记,若不一致或没有标记,则直接响应提示信息:“重复提交”
①把标记放到隐藏域中<input type=”hidden” name=”token” value=”stupid_qiu”/> 不可以 因为不能删除标记
②把标记放到request中,行不通因为表单刷新后,request已经被销毁,再提交表单是一个新的request
③把标记放到Session中 行得通
>z在原表单页面,生成一个随机的值token
>在原表单页面,把token值放入到Session属性中
>在原表单页面,把token值放入到隐藏域中
>在目标的Servlet中:获取session和隐藏域中的token值
>比较二个值是否一致,若一致,受理请求。且把session域中的token属性清楚
>若不一致,则直接响应也是页面“重复提交”
Index.jsp
<%
String tokenValue = new Date().getTime() + "";
session.setAttribute("token", tokenValue);
System.out.println("1");
%>
<form action="<%=request.getContextPath() %>/tokenServlet" method="post">
<input type="hidden" name ="token" value="<%=tokenValue%>">
name: <input type="text" name ="name" />
<input type="submit" value="submit">
</form>
Servlet
HttpSession session = request.getSession();
Object token = session.getAttribute("token");
String tokenValue = request.getParameter("token");
System.out.println(token);
System.out.println(tokenValue);
if (token != null && token.equals(tokenValue)) {
session.removeAttribute("token");
} else {
response.sendRedirect(request.getContextPath() + "/token/error.jsp");
return;
}