HoRain云--JSP安全实现记住密码功能
·

🎬 HoRain 云小助手:个人主页
⛺️生活的理想,就是为了理想的生活!
⛳️ 推荐
前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。
目录

JSP使用Cookie实现记住账号密码功能
在JSP中使用Cookie实现记住账号密码功能是常见的需求,但需要特别注意安全性。下面我将详细介绍实现方法和关键安全注意事项。
重要安全警告
绝对不要在Cookie中存储明文密码! 这是严重的安全漏洞。实际应用中应使用令牌机制(token)代替存储密码。
正确实现方案
1. 代码实现(安全版)
(1) 登录页面 (login.jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<h2>登录</h2>
<form action="loginCheck.jsp" method="post">
<label for="username">用户名:</label>
<input type="text" id="username" name="username" value="<%=
(request.getCookies() != null) ? getCookieValue(request.getCookies(), "username") : ""
%>"><br><br>
<label for="password">密码:</label>
<input type="password" id="password" name="password"><br><br>
<input type="checkbox" id="remember" name="remember" value="true">
<label for="remember">记住我</label><br><br>
<input type="submit" value="登录">
</form>
<%
String errorMessage = request.getParameter("error");
if (errorMessage != null && !errorMessage.isEmpty()) {
out.println("<p style='color:red;'>" + errorMessage + "</p>");
}
%>
<script>
// 检查是否有记住的用户名
document.addEventListener('DOMContentLoaded', function() {
var rememberMe = localStorage.getItem('rememberMe');
if (rememberMe === 'true') {
document.getElementById('remember').checked = true;
}
});
</script>
</body>
</html>
(2) 登录验证页面 (loginCheck.jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
// 获取表单参数
String username = request.getParameter("username");
String password = request.getParameter("password");
String remember = request.getParameter("remember");
// 模拟登录验证(实际应用中应连接数据库验证)
boolean isValid = false;
if ("admin".equals(username) && "123456".equals(password)) {
isValid = true;
}
if (isValid) {
// 如果选中"记住我",设置安全Cookie
if ("true".equals(remember)) {
// 生成唯一令牌(实际应用中应存储在数据库)
String token = java.util.UUID.randomUUID().toString();
// 1. 存储令牌到数据库(实际应用中)
// storeTokenInDatabase(username, token);
// 2. 设置Cookie(包含令牌)
Cookie tokenCookie = new Cookie("remember_token", token);
tokenCookie.setMaxAge(60 * 60 * 24 * 30); // 30天
tokenCookie.setHttpOnly(true); // 防止JavaScript访问
tokenCookie.setSecure(true); // 仅通过HTTPS传输
tokenCookie.setPath("/"); // 使Cookie对整个应用有效
response.addCookie(tokenCookie);
// 3. 保存用户名到Cookie(可选,但不存储密码)
Cookie usernameCookie = new Cookie("username", username);
usernameCookie.setMaxAge(60 * 60 * 24 * 30);
usernameCookie.setHttpOnly(true);
usernameCookie.setSecure(true);
usernameCookie.setPath("/");
response.addCookie(usernameCookie);
}
// 登录成功,跳转到主页
response.sendRedirect("welcome.jsp");
} else {
// 登录失败,返回登录页面
response.sendRedirect("login.jsp?error=用户名或密码错误");
}
// 辅助方法:从Cookie中获取值
private String getCookieValue(Cookie[] cookies, String cookieName) {
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals(cookieName)) {
return cookie.getValue();
}
}
}
return "";
}
%>
(3) 欢迎页面 (welcome.jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
// 从Cookie中获取用户名
String username = "";
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if ("username".equals(cookie.getName())) {
username = cookie.getValue();
break;
}
}
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>欢迎</title>
</head>
<body>
<h2>欢迎,<%= username %></h2>
<p><a href="logout.jsp">注销</a></p>
</body>
</html>
(4) 注销页面 (logout.jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
// 删除记住的令牌Cookie
Cookie tokenCookie = new Cookie("remember_token", "");
tokenCookie.setMaxAge(0); // 立即过期
tokenCookie.setPath("/");
response.addCookie(tokenCookie);
// 删除用户名Cookie
Cookie usernameCookie = new Cookie("username", "");
usernameCookie.setMaxAge(0);
usernameCookie.setPath("/");
response.addCookie(usernameCookie);
// 重定向到登录页面
response.sendRedirect("login.jsp");
%>
安全性关键点
-
绝不存储明文密码:只存储用户名(如果需要)或使用安全令牌机制
-
使用HttpOnly Cookie:
tokenCookie.setHttpOnly(true); // 防止XSS攻击 -
使用Secure属性:
tokenCookie.setSecure(true); // 仅通过HTTPS传输 -
设置Cookie路径:
tokenCookie.setPath("/"); // 使Cookie对整个应用有效 -
设置过期时间:
tokenCookie.setMaxAge(60 * 60 * 24 * 30); // 30天 -
使用安全的令牌生成:
String token = java.util.UUID.randomUUID().toString(); -
在服务器端存储令牌:
// 实际应用中应存储在数据库 // storeTokenInDatabase(username, token);
为什么不要存储明文密码?
- 密码泄露风险:如果Cookie被窃取,攻击者可以直接获取用户密码
- 违反安全最佳实践:密码应始终以哈希形式存储,从不以明文形式存储
- 合规性问题:许多安全标准(如PCI DSS)要求不存储明文密码
替代方案:令牌机制
- 用户登录时,服务器生成唯一令牌并存储在数据库
- 服务器将令牌发送给客户端,存储在Cookie中
- 客户端后续请求携带该令牌
- 服务器通过令牌验证用户身份
这种方式比存储密码更安全,即使令牌被窃取,攻击者也无法直接获取用户密码。
总结
| 方案 | 安全性 | 实现复杂度 | 推荐度 |
|---|---|---|---|
| 存储明文密码 | ⛔ 极低 | ⭐ 低 | ❌ 不推荐 |
| 存储用户名+令牌 | ⚠️ 中 | ⭐⭐ 中 | ✅ 推荐 |
| 仅存储令牌 | ✅ 高 | ⭐⭐⭐ 高 | ✅ 最佳实践 |
重要提示:在实际应用中,应使用Java Web框架(如Spring Security)来实现安全的记住登录功能,而不是手动处理Cookie。
额外建议
-
使用HTTPS:确保整个应用通过HTTPS传输,防止Cookie被中间人攻击
-
设置SameSite属性(Java 8+):
tokenCookie.setSameSite("Lax"); // 防止CSRF攻击 -
定期刷新令牌:在用户活跃时更新令牌有效期
-
提供"忘记密码"功能:允许用户重置密码并删除所有记住的Cookie
通过以上实现,您可以在JSP中安全地实现"记住账号"功能,同时避免严重的安全漏洞。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙
更多推荐

所有评论(0)