打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
防止表单重复提交

  有时候由于网络原因会造成页面加载缓慢,导致用户频繁点击提交按钮,或者用户手动点击页面的刷新按钮,都会造成表单数据的重复提交,无形中增加了服务器的压力,并且有时候可能会造成无法挽回的损失。比如用户在购物网站选中一款商品,因为页面反应延迟,导致用户多点击了添加按钮,而结算时用户没有注意,就会造成用户多买了同一件商品。


      防止表单重复提交,可以从两方面着手解决。

一、客户端:通过JavaScript来阻止 

<%@ page language="java" contentType="text/html; charset=utf-8"    pageEncoding="utf-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"]] ><html]] ><head]] ><meta http-equiv="Content-Type" content="text/html; charset=utf-8"]] ><title]] > Insert title here</title]] ><script type="text/javascript"]] >var isCommited = false;function checkPost(){if(!isCommited){isCommited = true;return true;}else{var div = document.getElementById("message");div.innerHTML = "请不要重复提交!";return false;}}</script]] ></head]] ><body]] ><form action="/day02/Servlet2" method="post" onsubmit="return checkPost()"]] >  姓名:<input type="text" name="name"]] >  性别:<input type="text" name="sex"]] >  <input type="submit" value="提交"]] >  <div id="message"></div]] ></form]] ></body]] ></html]] >

这种方式只能阻止用户重复点击提交按钮的提交,如果用户点击刷新按钮,或者点击后退按钮后再点提交,还会造成表单的重复提交。

二、服务器:利用session来阻止

     具体思路:在服务器端,生成一个唯一的标识符,将它存入session,同时将它写入表单的隐藏字段中,然后将表单页面发给浏览器,用户录入信息后点击提交,在服务器端,获取表单中隐藏字段的值,与session中的唯一标识符比较,相等说明是首次提交,就处理本次请求,然后将session中的唯一标识符移除;不相等说明是重复提交,就不再处理。

下面是相关代码:

<%@ page language="java" contentType="text/html; charset=utf-8"    pageEncoding="utf-8"%><%@ page import="java.util.UUID" %><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"]] ><html]] ><head]] ><meta http-equiv="Content-Type" content="text/html; charset=utf-8"]] ><title]] > Insert title here</title]] ></head]] ><body]] ><%String token = UUID.randomUUID().toString().replaceAll("-","");    session.setAttribute("token",token);%><form action="/day02/TokenServlet" method="post"]] >姓名:<input type="text" name="name"]] >性别:<input type="text" name="sex"]] ><input type="submit" name="提交"]] ><input type="hidden" name="formtoken" value="<%=token%>"]] ></form]] ></body]] ></html]] >

TokenServlet.java:

package com.mac.servlet; import java.io.IOException; import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession; public class TokenServlet extends HttpServlet {private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=utf-8");String formtoken = request.getParameter("formtoken");HttpSession session = request.getSession();String token = (String)session.getAttribute("token");if(formtoken.equals(token)){String name = request.getParameter("name");String sex = request.getParameter("sex");response.getWriter().println("姓名:"+name+";性别:"+sex);session.removeAttribute("token");}else{response.getWriter().println("请不要重复提交!");}} protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);} }

这种方式实际上被称为令牌机制,那个唯一的标识符就是令牌。

令牌机制不仅可以防止用户重复点击提交按钮带来的表单重复提交,还可以防止用户点击刷新按钮,以及后退后再点提交带来的表单重复提交问题。 


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
表单重复提交的处理方案(其中服务器处理 模拟struts)
Servlet 文件上传 | 菜鸟教程
在服务器端避免表单的重复提交
Servlet方法
JSP HTML JAVASCRIPT 中文乱码 解决方案 大全
Java平台国际编码问题分析_SUN-JAVA技术
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服