重定向防止表单重复提交

1、表单重复提交的情况:

(1)提交完表单之后,刷新网页。

(2)第一次单击提交之后,在没有提交成功情况下,又单击提交按钮。

(3)用户提交表单后,点击浏览器的【后退】按钮回退到表单页面后进行再次提交。

2、实例
(1)针对第一种情况(提交完表单之后,刷新网页)

一开始我们采用转发的方式进行页面跳转:
在这里插入图片描述

通过访问/user/login来到主页面后,刷新页面存在表单重复提交的问题,即每次刷新页面都会重新走一遍/user/login-->dashboard,登录页面往往都是有数据库查询操作,这样的表单重复提交会对后台产生压力。此时的访问路径为(http://localhost:8080/user/login
在这里插入图片描述

解决表单重复提交,我们可以用重定向来解决:
在这里插入图片描述

而我们这里的主页需要采用模板引擎进行解析,所以不能直接重定向到主页面。为此我们需要增加一个视图映射。

在这里插入图片描述

使用重定向之后,不管你怎么刷新,后台页面都不会再走/user/login-->dashboard这条路径了(此时的访问路径为http://localhost:8080/main.html):
在这里插入图片描述

(2)针对第二种情况(网络延迟)

点击提交按钮之后,使按钮不可用,通过js完成。

<script type="text/javascript">
 window.onload = function(){ 
  var btn = document.getElementById("btn");
  //为按钮绑定单击响应函数
  btn.onclick = function(){  
   //点击以后使按钮不可用
   this.disabled=true; 
   //当将提交按钮设置为不可用时,会自动取消它的默认行为
   //手动提交表单
   this.parentNode.submit(); 
  };
 };
</script>
<form action="${pageContext.request.contextPath }/login" >
	user:<input type="text" name="username">
	password<input type="password" name="pwd">
	<input type="submit" value="提交" id="btn">
</form>
(3)回退按钮重复提交表单

表单提交成功以后,直接点击浏览器上回退按钮,也会造成表单的重复提交。这主要是因为:服务器在处理请求时,并不会检查是否为重复提交的请求,这可能会导致恶意用户的攻击。

Java 使用Token令牌防止表单重复提交:

  • 在服务器端生成一个唯一的Token(令牌),同时在当前用户的Session域中保存这个Token。
  • 在处理请求之前,将Token发送到客户端的Form表单中,在Form表单中使用隐藏域来存储这个Token,表单提交的时候连同这个Token一起提交到服务器端。
  • 在服务器端判断客户端提交上来的Token与服务器端生成的Token是否一致,如果不一致,那说明不是同一次的请求,那就是重复提交了,此时服务器端就可以不处理重复提交的表单。如果相同则处理表单提交,处理完后清除当前用户的Session域中存储的标识号。
3、重复提交带来的问题
  • 向数据库中插入大量的重复数据,给数据库查询也带来了压力,占用了服务器资源。
  • 如果后端没有检查是否为重复的请求,那么可能会导致恶意的攻击。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值