往期回顾☛会话Cookie应用场景#登录实现用户名与密码持久化操作,有效期5day!
UUID定义
UUID 是 通用唯一识别码(Universally Unique Identifier)的缩写,是一种软件建构的标准,亦为开放软件基金会组织在分布式计算环境领域的一部分。其目的,是让分布式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定。
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> 登 录</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/ 欢迎转载,一起技术交流吧!