表单的重复提交问题解决方案
1.在我们的web开发中,常常会遇到表单的重复提交问题,那么我们的解决方案有两种:①重定向:response.sendrediect(); ②token的使用,即做个标记
下面写一个token的例子:(在tomcat上可以运行的。)
1.JSP页面,3个。
index.jsp
<%@ page language="java"import="java.util.*"pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>避免表单重复提交的例子</title>
</head>
<body>
<h4>请支付:</h4>
<%
String token = (String)request.getAttribute("mytoken");
out.print(token);
%>
<formaction="token.jspx?_m=pay"method="post">
<inputtype="hidden"name="token"value="<%=token %>"/>
<inputtype="text"name="money"/>
<inputtype="submit"value="支付"/>
</form>
</body>
</html>
suc.jsp
<%@ page language="java"import="java.util.*"pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>支付成功</title>
</head>
<body>
<h2style="color:red;">支付成功!感谢您的使用!</h2>
</body>
</html>
error.jsp
<%@ page language="java"import="java.util.*"pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>重复提交了</title>
</head>
<body>
<h2>系统正在处理,请勿重复提交!</h2>
</body>
</html>
2.com.hanchao.web.util是我们工具包
package com.hanchao.web.util;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
/**
* 工具类
* @author hanlw
* 2012-07-09
*/
publicclass TokenUtil {
//定义一个常量,此常量只是为以后取值,传值方便
privatestaticfinal String TOKEN = "TOKEN";
/**
* 获得唯一的token
* @param request
* @return
*/
public String getToken(HttpServletRequest request) {
//★UUID可以产生唯一的序列码
UUID uuid = UUID.randomUUID();
String token = uuid.toString();
HttpSession session = request.getSession();
session.setAttribute(TOKEN, token);
return token;
}
/**
* 验证token
* @param request
* @param requestToken
* @return
*/
publicboolean validateToken(HttpServletRequest request,String requestToken) {
HttpSession session = request.getSession();
String sessionToken = (String) session.getAttribute(TOKEN);
if(sessionToken != null &&
requestToken != null &&
sessionToken.equals(requestToken)) {
session.removeAttribute(TOKEN);
returntrue;
} else {
returnfalse;
}
}
}
3.我们的servlet
package com.hanchao.web.util;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
publicclass TokenServlet extends HttpServlet {
privatestaticfinallong serialVersionUID = 1L;
publicvoid doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String method = request.getParameter("_m");
if("pay".equals(method)) {
pay(request,response);
} elseif("tosave".equals(method)) {
save(request,response);
}
}
/**
* 产生token
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
privatevoid save(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{
TokenUtil util = new TokenUtil();
String token = util.getToken(request);
request.setAttribute("mytoken", token);
request.getRequestDispatcher("index.jsp").forward(request, response);
}
/**
* 支付
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
privatevoid pay(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{
String token = request.getParameter("token");
TokenUtil util = new TokenUtil();
boolean result = util.validateToken(request, token);
if(result) {
String money = request.getParameter("money");
System.out.println("支付"+money+"成功");
request.getRequestDispatcher("suc.jsp").forward(request, response);
} else {
request.getRequestDispatcher("error.jsp").forward(request, response);
}
}
publicvoid doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}
==================================================================
2013-06-21-add-han
昨天和我们的架构聊到这个问题,因为现在做的项目涉及到了。他说:对于分布式的大型互联网项目,这种token的方式,在高并发时可能会出现问题。所以,也建议用redirect最保险吧。谢谢
转载于:https://blog.51cto.com/hanchaohan/931145
表单的重复提交问题解决方案相关推荐
- Spring MVC表单防重复提交
转载自 Spring MVC表单防重复提交 利用Spring MVC的过滤器及token传递验证来实现表单防重复提交. 创建注解 @Target(ElementType.METHOD) @Retent ...
- 如何防止表单的重复提交
表单重复提交是在多用户Web应用中最常见.带来很多麻烦的一个问题.有很多的应用场景都会遇到重复提交问题,比如: (1)点击提交按钮两次. (2)点击刷新按钮. (3)使用浏览器后退按钮重复之前的操作, ...
- 表单防重复提交拦截器
表单防重复提交 http://blog.icoolxue.com/submitted-by-spring-mvc-to-prevent-data-duplication/
- 关于表单防重复提交一些东东
前阵子弄了些表单防重复提交的东西,想整理整理,免得下次要用时再四处去找,其实这里的东西还是挺简单的. 原理: 在Session中保存一个表单的唯一编号,将该编号放在一个隐藏域中,同其他数据一同提交.在 ...
- 利用beforeSend实现提交加载中、form表单的重复提交等前端功能
前文 在用JQ+bootstrap写前端的时候,有时需要实现点击按钮后失效的功能,比如下载按钮,为了避免网络延迟而引起的页面不及时跳转,让用户多次点击按钮,造成的服务器压力和用户体验就都不友好.发 ...
- uniqid php 重复_在php使用隐藏字段和uniqid来实现表单的重复提交
在php中,最简单,也是做常用的放发来放置表单重复提交的方法就是设置隐藏域的来实现,在php有一个uniqid();函数,他可以生成唯一的标示符,这样我们就可以通过判断这个标示符来判断表单是不是处于重 ...
- java表单防重复提交_防止表单重复提交的解决方案整理
用户在操作表单Post数据时往往会出现表单数据重复提交的问题,尤其在Web开发中此类问题比较常见.刷新页面,后退操作以前的页面,单机多次按钮都会导致数据重复提交.此类问题是因为浏览器重复提交HTTP请 ...
- python表单防重复提交_防止表单重复提交的几种策略
表单重复提交是在多用户Web应用中最常见.带来很多麻烦的一个问题.有很多的应用场景都会遇到重复提交问题,比如: 点击提交按钮两次. 点击刷新按钮. 使用浏览器后退按钮重复之前的操作,导致重复提交表单. ...
- js防止表单的重复提交
在表单提交的时候,用户有时候会重复的点击提交按钮,会导致多次提交,产生重复数据.我们应该怎么办了?一般想法是:通过attachEvent在 form的onsubmit事件中写一个方法,每次触发该事件时 ...
最新文章
- ScrollView 嵌套 ListView 只显示第一行的源码分析
- 智源研究院发布《2020北京人工智能发展报告》,剖析北京AI发展的17个中国“第一”...
- 强化学习笔记: MDP - Policy iteration
- 巨蟒python全栈开发flask11项目开始3
- 本科、硕士、博士之间的差距!
- 右下角文字如何写_如何提取任意小程序的小程序路径
- Any-Proxy在线反向代理源码
- 【网络信息安全】网络安全基础
- 虚拟机安装centos7后无法联网
- IntelliJ IDEA之Java开发常规项目配置介绍
- iOS-苹果官方开源网站;objc、Runloop、GCD、OC等开源代码
- 10、JDBC(重点)
- 百度BAE上能装什么pHp框架,百度Bae云平台安装dedecms图文教程
- 去除win10快捷方式的小箭头
- Jfinal极速开发微信系列教程--------------Jfinal_weixin demo的使用分析
- 面试题(javamysql)
- 宝鲲财经:外汇技术精髓
- workbench 左侧导航栏消失解决方案
- Java学习:创建简单的名片管理系统
- es - elasticsearch - aggs - metrics - rate
热门文章
- P1083 [NOIP 2012]借教室
- TPS(薄板样条) 2D 插值
- android 之 ListView 里面嵌套 GridView 遇到的问题及其解决方法。
- LoadRunner监控Linux的三种方法
- Windows Phone 7 MVVM模式通讯方式之实现Command
- Hbase常用操作(增删改查)
- 《Java解惑》陷阱和缺陷的目录
- gin获取post参数
- linux下的du命令
- STM32用USART发送字符串,以USART_FLAG_TXE和USART_FLAG_TC怎么用