防表单重复提交
来源:互联网 发布:罗马城市 知乎 编辑:程序博客网 时间:2024/05/01 14:36
<script type="text/javascript">
var isCommited = false;
function chechPost(){
if (!isCommited){
isCommited = true;
return true;
}else{
alert("You can not submit again");
return false;
}
}
document.ondblclick = function docondblclick() { window.event.returnValue = false; } document.onclick = function doconclick() { if (isCommited) { window.event.returnValue = false; } }
</script>
不足:当用户单击”刷新”,或单击”后退”再次提交表单,将导致表单重复提交。故还需后台程
序防止表单重复提交
FormServlet
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
response.setCharacterEncoding("utf-8");
response.setContentType("text/html; charset=utf-8");
request.setCharacterEncoding("utf-8");
PrintWriter writer = response.getWriter();
//防止表单重复提交
String token = request.getParameter("token");
HttpSession session = request.getSession();
String tokeninsession = (String) session.getAttribute("token");
if(token==null) { response.sendRedirect("/day07/servlet/FormServlet1"); return; }
if(tokeninsession==null) {response.sendRedirect("/day07/servlet/FormServlet1"); return;}
if(!token.equals(tokeninsession)) {
response.sendRedirect("/day07/servlet/FormServlet1");
return;
}
session.setAttribute("token", null);
}
FormServlet1
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
response.setCharacterEncoding("utf-8");
response.setContentType("text/html; charset=utf-8");
request.setCharacterEncoding("utf-8");
PrintWriter writer = response.getWriter();
String token = TokenProcessor.getInstance().makeToken();
request.getSession().setAttribute("token", token);
writer.write("<form action='/day07/servlet/FormServlet' method='post'>");
writer.write(" 用户名: <input type='text' name='username'><br>");
writer.write(" 密码: <input type='password' name='password'><br>");
writer.write("<input type='hidden' name='token' value='"+token+"'><br>"); // 令牌
writer.write("<input type='submit' value=' 登陆'>");
writer.write("</form>");
}
public class TokenProcessor { //工具类,产生随机令牌
//单例模式,私有的构造方法、提供私有变量记住实例、提供方法返回实例
private TokenProcessor(){}
private static TokenProcessor instance = new TokenProcessor();
public static TokenProcessor getInstance() { return instance; }
public String makeToken() {//产生令牌
//产生一个随机数 222332343434324234 3333 1 343242423
String token = System.currentTimeMillis() + new Random().nextInt(1999999) + "";
try { //数据指纹 md5 算法
MessageDigest md = MessageDigest.getInstance("md5");
byte[] md5 = md.digest(token.getBytes());
//base64算法 将3个字节转成4个字节
BASE64Encoder encoder = new BASE64Encoder();
String data = encoder.encode(md5);
return data;
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}
}
参考: http://mikzhang.iteye.com/blog/2043768
- 防表单重复提交
- 防表单重复提交
- 防表单重复提交
- spring 防重复提交表单
- JavaWeb_session_防表单重复提交
- jquery表单防重复提交
- Struts2_防表单重复提交
- springmvc表单防重复提交
- 客户端防表单重复提交和服务器端防重复提交
- 关于表单防重复提交一些东东
- 模拟Struts1实现防表单重复提交
- 模拟Struts1实现防表单重复提交
- Struts2防刷新重复提交表单设置
- 防表单重复提交三步
- 防表单重复提交中的小问题
- struts1(6)-----表单防重复提交
- 防表单重复提交粗暴的总结
- Spring MVC表单防重复提交
- PLSQL: IF-THEN-ELSE
- SQL step by step
- Maven----导入项目后报错
- linux_用户及用户组管理
- 现货黄金和TD黄金的比例
- 防表单重复提交
- Linux设备模型(5)_device和device driver
- 蓝桥杯算法提高——最大乘积
- 记事中快速加当前日期时间
- JSP页面出现空页面或部分页面
- js获得本周,本月,本季度的开始日期和结束日期
- 管道流在pc和Android上的差别
- 通过session统计访问量
- 城市问题