利用session防止重复提交

思路:

前端控制:在点击提交按钮后设置按钮不可用。

后台控制:利用session,在初次进入表单页面的时候前生成一个随机token,将token保存到session并返回到前端页面,前端提交页面,后台获取前端提交的token值与session中的token比较。

主要代码:

package 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 servlet.token.TokenProccessor; public class FormServlet extends HttpServlet{ private static final long serialVersionUID = 1L; @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 生成token
String token = TokenProccessor.getInstance().makenToken();
System.out.println("FormServlet中生成的token:" + token); req.getSession().setAttribute("token", token);
// 进入表单提交页面
req.getRequestDispatcher("/form.jsp").forward(req, resp);
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
this.doGet(req, resp);
}
}

处理提交的Servlet

package servlet;

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{ private static final long serialVersionUID = 1L; @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
// 判断是否重复提交
boolean b = isRepeatSubmit(req); if (true == b) {
System.out.println("重复提交");
return ;
} req.getSession().removeAttribute("token");
System.out.println("处理请求!");
String userName = req.getParameter("username");
try {
// 模拟系统处理
Thread.sleep(3*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("插入数据:"+userName);
} private boolean isRepeatSubmit(HttpServletRequest req) { String client_token = req.getParameter("token");
// 用户提交表单时不存在token 表示直接刷新页面重复提交
if (client_token == null) {
return true;
}
// 返回后再次提交,当前用户不存在token重复提交
String server_token = (String) req.getSession().getAttribute("token");
if(server_token==null){
return true;
}
// Session中令牌与表单提交不一致 重复提交
if (!client_token.equals(server_token)) {
return true;
}
return false;
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
this.doGet(req, resp);
} }

页面

<%@ 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>
</head>
<body>
<form action="${pageContext.request.contextPath }/DoFormServlet" method="post">
<%-- <input type="hidden" name="token" value="<%=session.getAttribute("token")%>"> --%>
用户名:<input type="text" name="username">
<input type="hidden" name="token" value="${token }">
<input type="submit" value="提交" id="submit">
</form>
</body> <script type="text/javascript">
function doSubmit(){
var btnSubmit = document.getElementById("submit");
btnSubmit.disabled="disabled";
return true;
}
</script>
</html>

防止重复提交demo的更多相关文章

  1. springmvc防止表单重复提交demo

    原理:在去某个页面直接生成一个随机数(这里使用的是UUID)并放入session中,用户提交表单时将这个随机数传入服务端与session中的值进行比较,如果不不存在或不相等,则认为是重复提交:如果相等 ...

  2. ASP.Net中防止页面刷新重复提交的几种方法

    [摘要] 目前很多网站都要提交页面插入或更新数据库,比如留言本,一个用户提交留言后,如果按F5,就会重新提交一遍留言,导致数据库出现两条一模一样的留言,本文介绍了几种防止页面刷新,导致重复提交数据的方 ...

  3. Token注解防止表单的重复提交

    注解的一些基础: 参见http://blog.csdn.net/duo2005duo/article/details/50505884和 http://blog.csdn.net/duo2005duo ...

  4. Strusts2笔记9--防止表单重复提交和注解开发

    防止表单重复提交: 用户可能由于各种原因,对表单进行重复提交.Struts2中使用令牌机制防止表单自动提交.以下引用自北京动力节点:

  5. session------>防表单重复提交

    方法一:用js控制表单提交--->但是容易在客户端被篡改代码,还是要加的 方法二:session 先给每一个表带上唯一的标志,再把标志存入session 当session中标志和表上标志都不为空 ...

  6. SQL防止重复提交和Filter

    /class User package com.neuedu.bean; import java.io.Serializable; public class User implements Seria ...

  7. Spring Boot (一) 校验表单重复提交

    一.前言 在某些情况下,由于网速慢,用户操作有误(连续点击两下提交按钮),页面卡顿等原因,可能会出现表单数据重复提交造成数据库保存多条重复数据. 存在如上问题可以交给前端解决,判断多长时间内不能再次点 ...

  8. SpringBoot--防止重复提交(锁机制---本地锁、分布式锁)

    防止重复提交,主要是使用锁的形式来处理,如果是单机部署,可以使用本地缓存锁(Guava)即可,如果是分布式部署,则需要使用分布式锁(可以使用zk分布式锁或者redis分布式锁),本文的分布式锁以red ...

  9. Springboot+Redisson自定义注解一次解决重复提交问题(含源码)

    前言   项目中经常会出现重复提交的问题,而接口幂等性也一直以来是做任何项目都要关注的疑难点,网上可以查到非常多的方案,我归纳了几点如下:   1).数据库层面,对责任字段设置唯一索引,这是最直接有效 ...

随机推荐

  1. 开启远程Windows系统3389端口

    1.Win7.Win2003.XP系统REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDen ...

  2. January 21st, 2018 Week 3rd Sunday

    Your attitude, not your aptitude, will determine your altitude. 决定你人生高度的,不是你的才能,而是你的态度. Actually, at ...

  3. Component name与package name/class name的关系?

    谢谢,那就是component name是package name + activity name?那class name呢?是.java中定义的class MyClass ???

  4. 洛谷P4551 最长异或路径

    传送门:https://www.luogu.org/problem/show?pid=4551 在看这道题之前,我们应懂这道题怎么做:给定n个数和一个数m,求m和哪一个数的异或值最大. 一种很不错的做 ...

  5. erc721-165学习

    ERC165: https://github.com/ethereum/EIPs/blob/master/EIPS/eip-165.md 就是一种发布并能检测到一个智能合约实现了什么接口的标准 这么做 ...

  6. Linux -- 利用 ptrace 进行代码注入

    #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h&g ...

  7. Ubuntu下禁止自动打开U盘等设备

    打开终端 禁止自动挂载: $ gsettings set org.gnome.desktop.media-handling automount false 禁止自动挂载并打开 $ gsettings ...

  8. Android 如果布局中有ScrollView和Fragment或者带有滚动条的布局进行嵌套,布局加载完成页面无法定位到顶部的情况

    页面无法定位到顶部: 1.ScrollView中嵌套Fragment(Fragment中可能有想ScrollView,ListView带有滚动条的控件). 2.ScrollView嵌套ScrollVi ...

  9. Luogu P3390 【模板】矩阵快速幂&&P1939 【模板】矩阵加速(数列)

    补一补之前的坑 因为上次关于矩阵的那篇blog写的内容太多太宽泛了,所以这次把一些板子和基本思路理一理 先看这道模板题:P3390 [模板]矩阵快速幂 首先我们知道矩阵乘法满足结合律而不满足交换律的一 ...

  10. [Python]Hamming distance 问题

    In [75]: x=4 In [76]: y=1 In [77]: str(bin(x ^ y))[2:].count('1') Out[77]: 2 In [78]: 来自:https://lee ...