JSP使用cookie实现记住账号密码的功能
所谓自动登录,就是下次打开的时候不用再次输入账号密码,一定程度上方便了用户,但也有它的缺点,就是可能泄露用户信息。
HTTP的无状态性
HTTP的无状态性,是指当客户端发请求给服务器的时候,服务器会响应客户端的请求,但当客户端再次发请求给服务器时,服务器并不知道这就是刚刚那个客户端。简单的说,就是服务器没有记忆,不会记住客户端。
那这样我们要让服务器记住一些事情怎么办呢?比如要记住客户端输入的账户信息,这时我们就可以使用JSP的cookie来实现这个功能。
保存用户状态的两种方式
- session
- cookie
下面我们来讲讲怎么用cookie实现记住账号信息的功能。
在JSP中创建和使用cookie
1.创建cookie对象
Cookie cookie = new Cookie(String name, Object value);
2.写入cookie对象
response.addCookie(cookie);
3.读取cookie对象
Cookie[] cookies = request.getCookies();
Cookie的一些常用方法,可以查看API,这是传送门https://docs.oracle.com/javaee/6/api/
下面我们用代码来看看,代码分为三块,
- 第一个是login.jsp,是用户的登陆界面,用户在此界面输入用户名和密码,在这个页面上,我们要判断用户是否选择了记住账号信息的选项,如果选择了,在账户输入框和密码输入框,我们就自动填上账户信息,如果没有勾选,则不填。
- 第二个是dologin.jsp,顾名思义,就是处理用户的输入信息,在这个页面,先判断用户是否勾选了记住账号信息的选项,如果勾选了,我们先用request内置对象读取用户输入的信息,然后把值放入新建的cookie对象,最后用response写入cookie对象。如果没有勾选,则判断cookie里是否有值,如果有值,则设置cookie的有效期,使cookie过期。
- 第三个是user_info.jsp,是显示用户信息的页面,超链接放在dologin.jsp里面。在这个页面,我们先先读取cookie的信息,如果不为空,则循环输出账号信息。
<!--login.jsp-->
<%@page import="java.net.URLDecoder"%>
<%@ 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>用户登录</title>
</head>
<body>
<h1>用户登录</h1>
<hr>
<!-- 判断用户是否选择了七天内免登录,如果选择了,则输入框内初始化为用户的账户信息 -->
<%
request.setCharacterEncoding("utf-8");
String username = "";
String password = "";
Cookie[] cookies = request.getCookies();
if(cookies != null && cookies.length > 0) {
for(Cookie c:cookies) {
if(c.getName().equals("usernameCookie")) {
// 解码
username = URLDecoder.decode(c.getValue(), "utf-8");
} else if(c.getName().equals("passwordCookie")) {
password = URLDecoder.decode(c.getValue(), "utf-8");
}
}
}
%>
<div>
<form action="dologin.jsp" method = "post">
<table>
<tr>
<td>用户名</td>
<td><input type = "text" name = "username" value = "<%=username%>"></td>
</tr>
<tr>
<td>密码</td>
<td><input type = "password" name = "password" value = "<%=password%>"></td>
</tr>
<tr>
<td style = "margin-left:1px"><input type = "checkbox" name = "isChecked" checked = "checked">七天免登录</td>
<td style = "margin-right:-1px"><input type = "submit" value = "submit"></td>
</tr>
</table>
</form>
</div>
</body>
</html>
<!--dologin.jsp-->
<%@page import="java.net.URLEncoder"%>
<%@ 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>用户登录成功界面</title>
</head>
<body>
<h1>用户登录成功界面</h1>
<hr>
<!-- 判断用户是否勾选了记住账户信息,如果勾选了,就使用cookie保存用户的账户信息,使用URLEncoder类进行编码,防止中文乱码 -->
<%
request.setCharacterEncoding("utf-8");
// 首先判断用户是否勾选了记住账户信息,如果勾选了值默认是on,也可以通过input的value属性设置
String[] r = request.getParameterValues("isChecked");
if(r != null && r.length > 0) {
// 获取输入的username和password,进行编码
String username = URLEncoder.encode(request.getParameter("username"), "utf-8");
String password = URLEncoder.encode(request.getParameter("password"), "utf-8");
// 新建cookie对象
Cookie usernameCookie = new Cookie("usernameCookie", username);
Cookie passwordCookie = new Cookie("passwordCookie", password);
// 设置cookie的有效期7天,单位为秒
usernameCookie.setMaxAge(604800);
passwordCookie.setMaxAge(604800);
// 写入cookie对象
response.addCookie(usernameCookie);
response.addCookie(passwordCookie);
} else {
//如果用户取消了记住账户信息,则应该对cookie里的信息进行清理
Cookie[] cookies = request.getCookies();
if(cookies != null && cookies.length > 0) {
for(Cookie c:cookies) {
if(c.getName().equals("usernameCookie") || c.getName().equals("passwordCookie")) {
// 使cookie过期
c.setMaxAge(0);
response.addCookie(c);
}
}
}
}
%>
<hr>
<a href = "user_info.jsp">查看用户详情</a>
</body>
</html>
<!--user_info.jsp-->
<%@page import="java.net.URLDecoder"%>
<%@ 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>用户信息界面</title>
</head>
<body>
<h1>用户信息界面</h1>
<hr>
<%
// 读取cookie里的信息
request.setCharacterEncoding("utf-8");
String username = "";
String password = "";
Cookie[] cookies = request.getCookies();
if(cookies != null && cookies.length > 0) {
for(Cookie c:cookies) {
if(c.getName().equals("usernameCookie")) {
// 解码
username = URLDecoder.decode(c.getValue(), "utf-8");
} else if(c.getName().equals("passwordCookie")) {
password = URLDecoder.decode(c.getValue(), "utf-8");
}
}
}
%>
用户名:<%=username %><br>
密码:<%=password %><br>
</body>
</html>
过程大概就这这样子。大家可以自己拿源码去试试看。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义