防止表单的重复提交

思想

  1. 打开页面时,生成一个token,将这个token保存到Session中,
  2. 在表单中提供一个隐藏域,设置其值为每1步中生成的token
  3. 在处理表单的Servlet中,获取表单隐藏域中的token与Session中的token进行比较,比较完之后直接将Session中的token删除
    • 如果相等可以提交,
    • 如果不相等,提示用户不能重复提交

示例

打开页面的Servlet

java 复制代码
@WebServlet("/open")
public class OpenServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
	  		//生成唯一的令牌
  		String token = UUID.randomUUID().toString();
  		//将生成的令牌放到Session中
  		request.getSession().setAttribute("token", token);
  		//
  		response.sendRedirect("demo.jsp");
	}
}

页面 demo.jsp

html 复制代码
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<html>
  <head>
    <title>防止表单的重复提交</title>
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">
  </head>
  <body>
    <form action="${pageContext.request.contextPath}/demo/deal" method="post">
    	<input type="hidden" name="token" value="${sessionScope.token}"/>
    	<input type="submit" value="提交"/>
    </form>
  </body>
</html>

处理表单请求的Servlet

java 复制代码
@WebServlet("/deal")
public class DealServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String fToken = request.getParameter("token");//隐藏域中的令牌
		HttpSession session = request.getSession();
		String sToken = (String) session.getAttribute("token");
		
		//检查令牌
		if(fToken.equals(sToken)){
			//把令牌从HttpSession中删除掉
			session.removeAttribute("token");
		}else{
			response.getWriter().write("请不要重复提交请求");
		}
	}

}
相关推荐
奋斗的袍子0075 天前
SpringBoot:token是用来鉴权的,那session的作用是什么?
spring boot·后端·token·session
春哥的魔法书1 个月前
JSON Web Token (JWT): 理解与应用
前端·json·状态模式·jwt·token
秋窗71 个月前
Node.js 使用 Express-Jwt和JsonWebToken 进行Token身份验证
node.js·express·token
花花少年1 个月前
通俗易懂理解Token分词(经验版)
token·tokenizer·分词器
爱吃香蕉的阿豪1 个月前
c# .net core项目中使用JWT进行权限校验
.netcore·jwt·token·权限校验
appleคิดถึง2 个月前
easyadmin layui js监听返回结果,进行token验证防止连点
javascript·layui·token
北海之灵2 个月前
使用JWT双令牌机制进行接口请求鉴权
vue·springboot·jwt·token
岑梓铭2 个月前
后端登录校验——Filter过滤器和Interceptor拦截器
java·spring boot·token·拦截器·interceptor·filter
司篂篂3 个月前
Token
前端·token
10km3 个月前
maven:中央仓库验证方式改变:401 Content access is protected by token
java·maven·token·401·sonatype·ossrh