会话Session应用场景#用UUID作为token,3步解决表单重读提交问题!

本文介绍如何使用UUID防止表单重复提交,详细解释UUID与Token的概念,以及在登录场景下如何利用Cookie实现用户名与密码的持久化。

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

往期回顾☛会话Cookie应用场景#登录实现用户名与密码持久化操作,有效期5day!

UUID定义

UUID 是 通用唯一识别码(Universally Unique Identifier)的缩写,是一种软件建构的标准,亦为开放软件基金会组织在分布式计算环境领域的一部分。其目的,是让分布式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定。

百度•百科-UUID定义

Token定义

在计算机身份认证中是令牌(临时)的意思,在词法分析中是标记的意思。一般作为邀请、登录系统使用。

百度•百科-Token定义

表单重复提交可能成立的条件

  • 转发跳转页面(地址栏不变),f5刷新

  • 网速慢,提交表单后,f5刷新

  • 提交表单后,单击回退按钮,再提交(现在浏览器基本已经做了验证,个别可能存在问题

解决表单重复提交问题(解决方案)

本质就是让表单只提交一次!

UUID:是一个十六进制的32位的随机数,全球唯一。

public class UUID_Demo {
	public static void main(String[] args) {
		String uuid = UUID.randomUUID().toString().replace("-","");
		//e5252e49-95f1-46c3-933f-7a6bf355ad24
		//处理后   f1ce0d5b2b60400bab93b227653b068f
		System.out.println(uuid);
	}
}

(必须掌握)实现步骤:

  第一步:生成一个UUID;

  第二步:将UUID分别存放到session域和隐藏域中;

  第三步:提交表单,分别从两个域中获取UUID。

   进行条件判断,是否相等:

​    相等:提交表单,将Session域中的UUID移除,即下次再提交表单时,两个域的值一定不会相等!

​    不相等:不提交表单。

代码示例

UserUuidServlet类:

package com.codinglin.demo;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class UserUuidServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	@SuppressWarnings("unused")
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	/*	(3)第三步:提交表单,分别从两个域中获取UUID
		       进行条件判断,是否相等:
		       相等:,即下次再提交表单时,两个域的值一定不会相等
		      不相等:不提交表单。*/
		
		//获取Session对象
		HttpSession session = request.getSession();
		//获取session域中的uuid
		Object sessionUuid = session.getAttribute("sessionUuid");
		if(sessionUuid == null || sessionUuid.equals("")) {
			System.out.println("表单重复提交,sessionUuid为null!");
		}else {
			System.out.println("sessionUuid:"+sessionUuid);
		}
	
		//获取隐藏域中的uui
		String hiddenUuid = request.getParameter("hiddenUuid");
		System.out.println("hiddenUuid:"+hiddenUuid);
		//判断是否相等
		if(sessionUuid != null && sessionUuid.toString().equals(hiddenUuid)) {
			//相等,提交表单
			System.out.println("提交表单!");
			session.removeAttribute("sessionUuid");
			
		}
		System.out.println("结束");	
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	
		doGet(request, response);
	}

}

uuidServletTest.jsp页面:

<%@page import="java.util.UUID"%>
<%@ 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>
<div align=center>
<!--在表单提交之前生成UUID,实际上使用过滤器效果更好-->
<%
        //(1)生成一个UUID
		String uuid = UUID.randomUUID().toString().replace("-","");
		//(2)将UUID分别存放到session域和隐藏域中
		session.setAttribute("sessionUuid",uuid);

%>
<h2>用户登录&Session验证表单重复提交</h2>
	<form action="UserUuidServlet" method="post">
	
<table >
<tr>
	<td></td>
	<!--(2)将UUID分别存放到session域和隐藏域中  -->
	<td><input type="hidden" name="hiddenUuid" value="<%=uuid%>"></td>
</tr> 
<tr>
	<td>用户名:</td>
	<td><input type="text"  name="username" value="${cookie.username.value}"/></td>
</tr> 
<tr>
	<td>&emsp;</td>
	<!-- type="text"方便测试 !正常是type="password" -->
	<td><input type="text"  name="pwd" value="${cookie.pwd.value}"/></td>     
</tr>
<tr>
	<td>记住密码(5day)</td>
	<td><input type="checkBox" name="checkBoxN" value="checkBoxV" checked="checked"></td>
</tr>
<tr>
	<td><input type="submit" value="登录"></td>   
	<td><input type="reset" value="重置"></td>
</tr>
</table>
</form>
</div>
</body>
</html>

​ 页面效果:

  之前操作Cookie后,用户名和密码已经存放在了cookie中。

在这里插入图片描述

(登录)提交1次、2次输出变化:

在这里插入图片描述


 ☝上述分享来源个人总结,如果分享对您有帮忙,希望您积极转载;如果您有不同的见解,希望您积极留言,让我们一起探讨,您的鼓励将是我前进道路上一份助力,非常感谢!我会不定时更新相关技术动态,同时我也会不断完善自己,提升技术,希望与君同成长同进步!

☞本人博客:https://coding0110lin.blog.youkuaiyun.com/  欢迎转载,一起技术交流吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值