博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
表单重复提交问题
阅读量:7098 次
发布时间:2019-06-28

本文共 2113 字,大约阅读时间需要 7 分钟。

表单重复提交------同一表单的内容多次重复提交到服务器

       比如插入数据时,同一表单多次提交,就会在数据库中插入多条重复的该条记录,造成严重的问题

表单重复提交分为三种情况:

1.提交完表单以后,不做其他操作,直接刷新页面,表单会提交多次。

- 这种情况产生的根本原因是,Servlet处理完请求以后,直接转发到目标页面。
- 这样整一个业务,只发送了一次请求,那么当你在浏览器中点击刷新按钮或者狂按f5会一直都会刷新之前的请求

                          

        解决方案:在Servlet中使用重定向跳转到目标界面,尤其是在增删改数据时,不能使用转发跳转。

2.在提交表单时,如果网速较差,可能会导致点击提交按钮多次,这种情况也会导致表单重复提交。

- 产生的原因:是因为咱们的提交按钮可以点击多次。

解决方案:使提交按钮只能点击一次。这事咱们得通过js来完成。

window.onload = function(){						//获取按钮的对象					var btn = document.getElementById("sub_btn");					//为按钮绑定单击响应函数					btn.onclick = function(){											//点击以后使按钮不可用						this.disabled=true;											//当将提交按钮设置为不可用时,会自动取消它的默认行为						//手动提交表单						this.parentNode.submit();										};							};
3.表单提交成功以后,直接点击浏览器上回退按钮,不刷新页面,然后点击提交按钮再次提交表单。

                    - 产生的原因:

因为服务器在处理请求时,不会检查是否为重复提交的请求。
    - 解决方案:
使用一个token的机制。
- token就是令牌的意思。
- 服务器在处理请求之前先来检查浏览器的token。
- token由服务器来创建,并交给浏览器,浏览器在向服务器发送请求时需要带着这个token
- 服务器处理请求前检查token是否正确,如果正确,则正常处理,否则返回一个错误页面
- 服务器所创建的token只能使用一次。
- token一般使用一个唯一的标识。

            

相关代码:

        登录页面代码:

<%	UUID uuid=UUID.randomUUID();	String id=uuid.toString();	session.setAttribute("Uid", id);%>	
用户名: 密码:
       LoginServlet中的代码:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {		String username = request.getParameter("username");		String password=request.getParameter("password");		String uuid=request.getParameter("uid");		System.out.println(uuid);		HttpSession session = request.getSession();		String Uid=(String) session.getAttribute("Uid");		session.removeAttribute("Uid");		if(uuid.equals(Uid)){			String sql="select * from user where Name=? and Password=?";			User user=Jdbcutil.findByNameAndPassword(sql, username, password);			if(user!=null){				//request.getRequestDispatcher("/login-success.jsp").forward(request, response);				session.setAttribute("user", user);				response.sendRedirect(request.getContextPath()+"/login-success.jsp");			}else{				response.sendRedirect(request.getContextPath()+"/login-error.jsp");			}		}else{			response.getWriter().println("login false!!!");		}	}
           
第三种问题的解决方法同时可以解决前两种问题

转载于:https://www.cnblogs.com/mazhitao/p/7424419.html

你可能感兴趣的文章
eclipse 快捷键大全,eclipse查找类,文件,添加注释
查看>>
Android4.0蓝牙使能的详细解析
查看>>
Freemarker常用技巧(三)
查看>>
Java Gradle入门指南之依赖管理(添加依赖、仓库、版本冲突) (转)
查看>>
使用反射生成并操作对象
查看>>
开源jabber(XMPP)架设内部即时通讯服务的解决方案
查看>>
行为统计学第二章知识总结(未完)
查看>>
关闭注册表编辑器,重新启动计算机后生效。这样资源管理器重启后就不会自动重启了。...
查看>>
Knockout应用开发指南(完整版) 目录索引
查看>>
A example that using JQuery clone
查看>>
随机梯度下降(Stochastic gradient descent)和 批量梯度下降(Batch gradient descent )的公式对比、实现对比...
查看>>
Android 使用JSON格式与服务器交互 中文乱码问题解决
查看>>
_DataStructure_C_Impl:链串
查看>>
openvas
查看>>
SecureCRT同时向多个终端发送命令
查看>>
【IntelliJ】IntelliJ IDEA常用设置及快捷键以及自定义Live templates
查看>>
indexOf 和 lastIndexOf 的区别
查看>>
spring boot整合activemq消息中间件
查看>>
Spark:java api实现word count统计
查看>>
mqtt-jmeter
查看>>