重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
java jsp处理用户多次点击提交按钮造成数据重复,最常见的方法是点击按钮提交之后,让线程休眠几秒再执行,如下代码:
成都创新互联公司是专业的龙文网站建设公司,龙文接单;提供做网站、网站设计,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行龙文网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!
1.提交的表单页面
%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%
!DOCTYPE HTML
html
head
titleForm表单/title
/head
body
form action="${pageContext.request.contextPath}/servlet/DoFormServlet" method="post"
用户名:input type="text" name="username"
input type="submit" value="提交" id="submit"
/form
/body
/html
2.处理提交表单的servlet,里面有提供防止重复提交的代码,如下:
package xdp.gacl.session;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DoFormServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//客户端是以UTF-8编码传输数据到服务器端的,所以需要设置服务器端以UTF-8的编码进行接收,否则对于中文数据就会产生乱码
request.setCharacterEncoding("UTF-8");
String userName = request.getParameter("username");
try {
//让当前的线程睡眠3秒钟,模拟网络延迟而导致表单重复提交的现象
Thread.sleep(3*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("向数据库中插入数据:"+userName);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
1.新建两个文件
index.jsp -- 表单页面
success.jsp -- 结果提示页面
2
2.代码分别如下:
3
3.新建TokenServlet,代码如下
4
4.运行index.jsp,输入用户名,点击提交
5
5.正常跳转结果页面
6
6.但当我在这个页面点击刷新的时候,出现如下提示
7
7.点击重试,发现又一次调用了servlet,这就是一个重复提交
8
8.多刷新几次,注意看URL地址,现在仍然是servlet
9
9.以前说重定向可以解决表单重复提交的问题,我们修改Servlet代码如下
10.再次测试,发现重定向到了success.jsp ,再点击刷新的话也不会出现重复提交了
11.那问题解决了么?再看,当我点击浏览器中的返回,然后再点击提交,如此反复,仍然在重复调用Servlet,这也是重复提交
12.现在修改Index.jsp
13.修改servlet代码
14.新建token文件,代码如下
15.在浏览器中测试(注,这里如果再使用Eclipse自带浏览器的话,会出现缓存问题,所以使用正常的浏览器火狐或者IE)
16.hidden中的token 和session中的token是相同的
17.当点击浏览器中的后退按钮,再次进行操作,发现不能重复提交
18.这是因为session中的token已经被移除掉了
19.而返回后刷新页面,相当于新开一个index.jsp 重新获取token 赋值给session,这时可以正常提交了
是username没有拿到值。文件框你还是用struts2自带的标签的文本框,再尝试下。
防止重复提交的方法很多,例如:
1、Meta法
在你的表单页里HEAD区加入这段代码:
META HTTP-EQUIV="pragma" CONTENT="no-cache"
META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate"
META HTTP-EQUIV="expires" CONTENT="Wed, 26 Feb 1997 08:21:57 GMT"
2、令牌法
生成一个令牌保存在用户session中,在form中加一个hidden域,显示该令牌的值,form提交后重新生成一个新的令牌,将用户提交的令牌和session中的令牌比较,如不同则为重复提交。
3、禁用按钮法
input type="button" value="提交" onclick="this.disabled=true;this.form.submit()"
4、struts配置法
修改struts-config.xml文件,在action里面有一个redirect重新定向的属性,struts中默认的是false,添加这个属性,改成true,在forword中写上要跳转页面的绝对或者相对地址就行了
修改如下:
action-mappings
action attribute="newsActionForm" name="newsActionForm" input="/addnews.jsp" path="/newsAction" parameter="method" scope="request" type="com.yongtree.news.action.NewsAction"
forward name="list" path="/listnews.jsp" redirect="true"/forward
forward name="error" path="/addnews.jsp"/forward
/action
/action-mappings