📜  使用Cookies的Servlet登录和注销示例(1)

📅  最后修改于: 2023-12-03 14:49:48.093000             🧑  作者: Mango

使用Cookies的Servlet登录和注销示例

在Web应用程序中,用户登录和注销是必不可少的功能,而Cookie是一种存储在用户本地浏览器上的数据,可以在多个页面和会话之间共享。在本篇文章中,我们将介绍如何使用Cookie在Servlet中实现用户的登录和注销功能。

1. 登录功能

在登录功能中,我们需要向用户提供一个表单,让他们输入用户名和密码,验证用户的身份,并在验证通过后向用户的浏览器发送一个Cookie,以便在后续的请求中识别该用户。

下面是一个简单的登录页面:

<!DOCTYPE html>
<html>
<head>
	<title>Login Page</title>
</head>
<body>
	<form action="loginServlet" method="post">
		<label for="username">Username:</label>
		<input type="text" id="username" name="username" required><br>
		<label for="password">Password:</label>
		<input type="password" id="password" name="password" required><br>
		<input type="submit" value="Login">
	</form>
</body>
</html>

在这个表单中,我们使用了POST方法将表单数据发送到一个名为“loginServlet”的Servlet。接下来,我们需要编写这个Servlet来验证用户的身份,并向该用户发送一个Cookie。

@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	// 这里假设我们有一个用户列表,并且每个用户都有一个唯一的用户名和密码
	private static final Map<String, String> userMap = new HashMap<>();
	static {
		userMap.put("admin", "password");
		userMap.put("user1", "123456");
		userMap.put("user2", "abcdef");
	}
	
    public LoginServlet() {
        super();
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	String username = request.getParameter("username");
    	String password = request.getParameter("password");
    	if (userMap.containsKey(username) && userMap.get(username).equals(password)) {
    		// 如果用户名和密码正确,向该用户发送一个Cookie
    		Cookie cookie = new Cookie("user", username);
    		cookie.setMaxAge(60*60*24*7); // 有效期为一周
    		response.addCookie(cookie);
    		response.sendRedirect("welcome.jsp"); // 登录成功,重定向到欢迎页面
    	} else {
    		response.sendRedirect("login.jsp?error=1"); // 用户名或密码错误,重定向到登录页面并显示错误信息
    	}
    }

}

在这个Servlet中,我们首先从请求中获取用户输入的用户名和密码,并将其与我们的用户列表进行比较。如果验证通过,就向该用户发送一个名为“user”的Cookie,有效期为一周,并将用户重定向到一个名为“welcome.jsp”的页面。如果验证不通过,就重定向到登录页面,并在URL中添加一个名为“error”的参数,以便在页面上显示错误信息。

2. 欢迎页面

在欢迎页面中,我们需要使用Cookie来识别当前用户,并向用户提供一个注销按钮,以便用户可以清除其Cookie并注销。

下面是一个简单的欢迎页面:

<!DOCTYPE html>
<html>
<head>
	<title>Welcome Page</title>
</head>
<body>
	<h1>Welcome, <span id="username"></span>!</h1>
	<input type="button" value="Logout" onclick="logout();">
	<script>
		// 获取当前用户的用户名
		var username = getCookie("user");
		document.getElementById("username").textContent = username;
		
		// 注销按钮的点击事件
		function logout() {
			deleteCookie("user");
			location.reload();
		}
		
		// 获取指定名称的Cookie的值
		function getCookie(name) {
			var cookies = document.cookie.split("; ");
			for (var i = 0; i < cookies.length; i++) {
				var parts = cookies[i].split("=");
				if (parts[0] === name) {
					return parts[1];
				}
			}
			return "";
		}
		
		// 删除指定名称的Cookie
		function deleteCookie(name) {
			document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT";
		}
	</script>
</body>
</html>

在这个页面中,我们使用了JavaScript代码来获取当前用户的用户名,并向页面上的“Welcome”消息中插入该用户名。我们还为“Logout”按钮添加了一个点击事件,该事件将删除名为“user”的Cookie,并重新加载该页面。

3. 注销功能

在注销功能中,我们需要删除当前用户的Cookie,并将该用户重定向到登录页面。

下面是一个简单的注销Servlet:

@WebServlet("/logoutServlet")
public class LogoutServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

    public LogoutServlet() {
        super();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	Cookie cookie = new Cookie("user", "");
    	cookie.setMaxAge(0); // 将Cookie的有效期设为0,即立即删除该Cookie
    	response.addCookie(cookie);
    	response.sendRedirect("login.jsp"); // 注销完成,重定向到登录页面
    }

}

在这个Servlet中,我们首先创建一个名为“user”的空Cookie,并将其有效期设为0,即立即删除该Cookie。然后,我们将该Cookie添加到响应中,并将用户重定向到登录页面。

4. 总结

在本篇文章中,我们介绍了如何使用Cookie在Servlet中实现用户的登录和注销功能。通过使用Cookie,我们可以在多个页面和会话之间共享用户的状态信息,从而为用户提供更好的使用体验。