博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
防止表单重复提交
阅读量:4102 次
发布时间:2019-05-25

本文共 2517 字,大约阅读时间需要 8 分钟。

在注册表单中,我们会遇到表单重复提交

在这里有两种解决方案,一种是在前端阻止,一种在服务器端阻止

1.在javaScript里阻止表单重复提交

Insert title here
用户名:

在实际开发中javaScript的方法是有漏洞的(如果有人想重复提交还是有办法重复提交的)

所以我们还需要在服务器端一起阻止表单重复提交

2.在服务器端阻止表单重复提交

思路:表单由程序输出给浏览器,在每个表单里设置唯一的表单号,并且将表单号存储在服务器。提交表单后,服务器拿出表单号进行比较,如果有便表示没有提交过,然后删除表单号。

我们写一个servlet用于产生表单号

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {		//产生随机数(表单号)  我们需要创建一个随机数的发生器		TokenProcessor instance = TokenProcessor.getInstance();		String token = instance.generateToken();		//将随机数存入session   方便到时候 验证		HttpSession session = request.getSession();		session.setAttribute("token", token);		//请求转发		request.getRequestDispatcher("/form.jsp").forward(request, response);			}
创建一个随机数生产器

//创建一个随机数的发生器class TokenProcessor{//token:令牌	/*	 * 单例设计模式	 * 	1.把构造方法私有	 * 	2.自己创建一个	 * 	3.对外暴露一个方法,允许获取上面创建的对象	 */	private TokenProcessor(){}	private static final TokenProcessor instance = new TokenProcessor();		public static TokenProcessor getInstance(){		return instance;	}	//产生随机数	public String generateToken(){		//获取当前时间  +  随机数		String token =  System.currentTimeMillis()+ new Random().nextInt()+"";	 try {			//得到数据的摘要(指纹)  创建实例 "md5"算法			MessageDigest md = MessageDigest.getInstance("md5");			byte[] md5 = md.digest(token.getBytes());			/* base64编码			 * 然后数经过base64算法编码返回的都是一个明文字符串			 * 会把三个字节变成四个字节   每三个字节变成四个字节			 */			BASE64Encoder encoder = new BASE64Encoder();			return encoder.encode(md5);		 } catch (NoSuchAlgorithmException e) {			throw new RuntimeException(e);		}	}}
创建form表单

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>
Insert title here
用户名:
我们访问该servlet
查看源码我们发现生成的随机数

当表单提交后,它会进入此servlet 进行表单号的判断来确定它是否是合理的请求

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {		//判断表单号是否有效		boolean b = isTokenValid(request);		if(!b){			System.out.println("请不要重复提交");			return;		}		request.getSession().removeAttribute("token");		System.out.println("向数据库中注册用户");	}	//判断表单号是否有效	private boolean isTokenValid(HttpServletRequest request) {		//客户机带过来的表单号		String client_token = request.getParameter("token");		if(client_token==null){			return false;		}		//获取session里的表单号		String server_token = (String) request.getSession().getAttribute("token");		if(server_token==null){			return false;		}		//判断客户机的表单号与session里的表单号是否不相等		if(!server_token.equals(client_token)){			return false;		}		return true;	}

你可能感兴趣的文章
Kubernetes集群搭建之CNI-Flanneld部署篇
查看>>
k8s web终端连接工具
查看>>
手绘VS码绘(一):静态图绘制(码绘使用P5.js)
查看>>
手绘VS码绘(二):动态图绘制(码绘使用Processing)
查看>>
基于P5.js的“绘画系统”
查看>>
《达芬奇的人生密码》观后感
查看>>
论文翻译:《一个包容性设计的具体例子:聋人导向可访问性》
查看>>
基于“分形”编写的交互应用
查看>>
《融入动画技术的交互应用》主题博文推荐
查看>>
链睿和家乐福合作推出下一代零售业隐私保护技术
查看>>
Unifrax宣布新建SiFAB™生产线
查看>>
艾默生纪念谷轮™在空调和制冷领域的百年创新成就
查看>>
NEXO代币持有者获得20,428,359.89美元股息
查看>>
Piper Sandler为EverArc收购Perimeter Solutions提供咨询服务
查看>>
RMRK筹集600万美元,用于在Polkadot上建立先进的NFT系统标准
查看>>
JavaSE_day12 集合
查看>>
JavaSE_day14 集合中的Map集合_键值映射关系
查看>>
Day_15JavaSE 异常
查看>>
异常 Java学习Day_15
查看>>
JavaSE_day_03 方法
查看>>