防止表单的多次提交情况处理
2017-09-27 17:18
218 查看
在说明处理方案前,我们先来列举一下有哪些情况会出现表单重复提交的情况,接着我们从客户端到服务端的顺序逐一说明处理方案。
多次点击提交按钮
提交表单后,点击浏览器的后退按钮
使用浏览器的历史记录重复提交表单
点击浏览器的刷新按钮
若有读者发现仍有其它重复提交表单的情况,欢迎留言提出,谢谢。
在提交表单后,使用JS将提交按钮disable。这种方法可以防止用户多次点击提交按钮,但若是客户端禁止了js或者用户知道表单提交的地址以及表单的结构,自行生成表单进行重复提交,该方法也就无效了。
在请求表单页面时,服务端生成一个能够标识的特殊标志串,存在Session中,并放在表单的隐藏域里。服务端接收处理表单数据时,检查标识串与Session中的标识串是否一致,若一致表明是首次提交,则立即从哪Session中删除,然后正常处理数据,否则不再处理。
使用Cookie记录表单提交的状态,根据其状态可以检查是否已经提交表单。若客户端禁止了Cookie,该方法将不起作用。
使用Post/Redirect/Get模式,简单来说就是提交表单后,执行一次客户端的重定向,转到提交成功信息提示页面。这种方式能够避免客户重复按刷新和点击后退按钮导致的重复提交表单。
在数据库里添加唯一约束或者创建唯一索引,防止出现重复数据。这也是一种防止重复提交表单数据的方式。
如何避免表单的重复提交a.在表单中:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
b.在servlet中:
转载内容详情点击打开链接
转载内容详情点击打开链接
多次点击提交按钮
提交表单后,点击浏览器的后退按钮
使用浏览器的历史记录重复提交表单
点击浏览器的刷新按钮
若有读者发现仍有其它重复提交表单的情况,欢迎留言提出,谢谢。
客户端角度
在提交表单后,使用JS将提交按钮disable。这种方法可以防止用户多次点击提交按钮,但若是客户端禁止了js或者用户知道表单提交的地址以及表单的结构,自行生成表单进行重复提交,该方法也就无效了。在请求表单页面时,服务端生成一个能够标识的特殊标志串,存在Session中,并放在表单的隐藏域里。服务端接收处理表单数据时,检查标识串与Session中的标识串是否一致,若一致表明是首次提交,则立即从哪Session中删除,然后正常处理数据,否则不再处理。
使用Cookie记录表单提交的状态,根据其状态可以检查是否已经提交表单。若客户端禁止了Cookie,该方法将不起作用。
服务端角度
使用Post/Redirect/Get模式,简单来说就是提交表单后,执行一次客户端的重定向,转到提交成功信息提示页面。这种方式能够避免客户重复按刷新和点击后退按钮导致的重复提交表单。在数据库里添加唯一约束或者创建唯一索引,防止出现重复数据。这也是一种防止重复提交表单数据的方式。
a.表单提交“请求”到servlet后,servlet再将“请求”转发到一个jsp页面,在响应页面点击刷新。分析:点击刷新时,地址栏中的URL还是原来的请求输入的地址,点击刷新后,就是发出再一次的请求,所以表单重复提交。 b.当有网络延迟,或者线程阻塞的情况下,在响应页面没有到达时,重复点击提交按钮。分析:很明显,浏览器发出了多次请求,表单重复提交。 c.在响应页面,点击返回,再点击“提交”。分析:和a其实是一个效果
如何避免表单的重复提交a.在表单中:
<body> <% //在原表单页面,生成一个token随机值, String tokenValue=new Date().getTime() +""; %> <form method="post" action="/SuccessServlet"> <% //把token放入session中 session.setAttribute("token",tokenValue); %> <!-- 把token放入隐藏域中 --> <input type="hidden" name="token" value=<%=tokenValue %>/> name:<input type="text" name="name"/> <input type="submit" value="提交"/> </form> </body>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
b.在servlet中:
//表单的token提交到servlet时,检查标记是否和已经存在的session中的token值一致, //若一致,则相应请求,并销毁标记,若不一致或者没有标记则直接相应提示信息----表单重复提交 HttpSession session = request.getSession(); Object token = session.getAttribute("token"); String tokenValue = request.getParameter("token"); if(token.equals(tokenValue) &&token != null){ session.removeAttribute("token"); }else{ response.sendRedirect(request.getContextPath()+"/error.jsp"); }
转载内容详情点击打开链接
转载内容详情点击打开链接
相关文章推荐
- 心得3--表单提交时防止用户不小心提交多次及有人恶意提交案例分析
- 用几行Asp代码实现防止表单多次被提交
- 防止表单提交按钮多次提交的办法
- 防止在服务器处理完成之前用户多次点击提交按钮处理代码
- 关于Asp.Net中避免用户连续多次点击按钮,重复提交表单的处理
- 关于Asp.Net中避免用户连续多次点击按钮,重复提交表单的处理
- 表单提交后,提交按钮不可用,防止用户多次提交
- 防止表单多次提交,添加重复数据
- 关于防止用户表单多次提交方案的思考
- 防止form表单提交按钮多次点击导致提交多次
- Servlet、SPringMVC、Struts等防止表单重复提交的多种处理方法
- Struts2 <s:token/>标签 防止表单多次提交
- 表单防止重复提交处理的前后台两种处理方式
- 如何防止多次提交同一个表单?
- golang处理表单的输入+非空判断+防止表单重复提交
- 使用tokenid 防止表单多次提交
- ASP防止重复多次提交表单的方法
- 防止表单回车form自动提交以及检测回车事件并处理
- 防止表单多次提交
- 如何处理:下载文件的按钮在事件未完成之前防止多次点击,事件完成之后又能继续点击提交