Servlet学习笔记---防止表单重复提交

本文介绍三种防止表单重复提交的方法:使用JavaScript限制提交、禁用提交按钮及利用Session管理token。通过这些技术确保数据准确性和安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一种方法:用javascript来防止重复提交

<script>

var   committed=false;

function dosubmit()

{ 

    if(committed)

     return false;

    committed=true;

    return true;

}

</script>

<body>

<form    action="..."  method="post"    onsubmit="return dosubmit()">

用户名:。。。。。。

<input type="submit"    value="提交"   id="submit">
</form>

</body>

onsubmit只有在返回true时,才会提交。

第二种方法:

一次提交后,设置按钮为不可点,阻止重复提交。

   <head>
	<script type="text/javascript">
	function dosubmit()
	{
		var sub=document.getElementById("submit");
		sub.disabled="disabled";
		return true;
	}
	
	</script>
  </head>
  <body>
<form    action="/SessionShop/servlet/Form"  method="post"    onsubmit="dosubmit()">

用户名:<input type="text"  name="username">
<input type="submit"    value="提交"   id="submit"   >
</form>
  </body>
上述两种方法都是客户端防止提交,但考虑到有的用户关闭了javasript,所以必须采用服务器端防止提交。

先给代码:

Form.java

package com.form;

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 Form extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.getSession().setAttribute("token", System.currentTimeMillis()+"");
	//	response.sendRedirect("/SessionShop/servlet/Form");
		request.getRequestDispatcher("/index.jsp").forward(request, response);
	}
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}

index.jsp

<form    action="/SessionShop/servlet/DoForm"  method="post"   >
<input type="hidden" value="${ token}"  name="token"></hidden>
用户名:<input type="text"  name="username">
<input type="submit"    value="提交"   id="submit"  >
</form>
DoForm.java

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
			String token = (String) request.getSession().getAttribute("token");
			String client_token=request.getParameter("token");			
			System.out.println(token+"----"+client_token);
			if(token==null)
			{
				System.out.println("不要重复提交1");
				return ;
			}

			if(client_token==null)
			{
				System.out.println("不要重复提交2");
				return ;
			}
			if(!token.equals(client_token))
			{
				System.out.println("不要重复提交3");
				return ;
			}
			request.getSession().removeAttribute("token");
			System.out.println("用户已添加到数据库");
	}

然后说说服务器端阻止恶意提交的坑点:

1.在index.jsp中获取¥(token)的值时,很容易给两端加上空格,然后一直显示不能重复提交。

2.记得在用户添加到数据库后,一定要把Session的token属性给移除了。

提示:之所以用Session来携带token信息,是因为这个还要在DoForm文件里用,故不可以用request携带。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值