JavaWeb学习——day8(MVC模式与session、cookie)
文章目录
- 一、MVC 模式
- 1. MVC 模式概述
- 2. MVC 模式的优势
- 3. MVC 的组件作用
- 二、实现用户注册功能(cookie保存用户名 session保存登陆状态 )
- 步骤 1:修改 LoginServlet.java 处理登录请求
- 步骤 2:设计 main.jsp 主界面,显示用户名
- 步骤 3:创建 logout.jsp 处理用户退出
- 步骤 4:实现自动登录功能(可选)
- 测试 Session 和 Cookie
- 步骤 1:登录并检查 Session 和 Cookie
- 检查 Session:
- 步骤 2:检查 Cookie
- 检查 Cookie:
- 验证自动填写:
- 2. 测试登出功能
- 步骤 1:退出登录
- 步骤 2:检查登出后是否清除 Session 和 Cookie
一、MVC 模式
1. MVC 模式概述
- MVC(Model-View-Controller)是一种分层架构模式,用于分离应用的不同功能,增强代码的可维护性和可扩展性。
- Model(模型层):负责应用的核心数据和业务逻辑,处理数据的获取、处理、存储等。
- View(视图层):负责展示数据给用户,通常是 HTML 页面、JSP 页面等。
- Controller(控制器层):作为用户请求的调度中心,负责接收请求、调用模型层业务处理,再将结果交给视图层展示。
2. MVC 模式的优势
- 解耦:每一层关注不同的职责,避免了功能逻辑混合。
- 灵活性:可以轻松替换视图层(比如从 JSP 换成其他框架)。
- 可维护性:逻辑清晰,便于测试和修改。
- 团队协作:不同开发人员可以分别负责不同层(前端、后端、数据层)。
3. MVC 的组件作用
- Model(模型层):
负责数据的持久化操作(如数据库交互),它不关心数据如何展示,专注于业务逻辑。 - View(视图层):
展示用户数据,接收用户输入。视图层通常是 JSP、HTML,或者前端框架。 - Controller(控制器层):
控制器是请求的入口,负责接收用户的请求、调用适当的 Model 来处理数据,再将结果传递给 View。
二、实现用户注册功能(cookie保存用户名 session保存登陆状态 )
步骤 1:修改 LoginServlet.java 处理登录请求
在 LoginServlet.java 中处理登录请求,并在登录成功后创建 Session、设置 Cookie。
package com.example.controller;import com.example.model.UserService;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.Cookie; // 确保这里导入jakarta
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import java.io.IOException;@WebServlet("/login")
public class LoginServlet extends HttpServlet {private UserService userService = new UserService();@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String username = request.getParameter("username");String password = request.getParameter("password");String rememberMe = request.getParameter("rememberMe");boolean isAuthenticated = userService.checkLogin(username, password);if (isAuthenticated) {HttpSession session = request.getSession();session.setAttribute("username", username);// 关键修复:统一使用 jakarta.servletif (rememberMe != null) {// 使用 jakarta.servlet.http.CookieCookie cookie = new Cookie("username", username);cookie.setMaxAge(30 * 24 * 60 * 60); // 30天有效期response.addCookie(cookie);}response.sendRedirect("main.jsp");} else {response.sendRedirect("fail.jsp");}}
}
- 解释:
登录成功后,创建一个 HttpSession,并将用户名存入 session 中。
如果勾选了“记住我”,就通过 Cookie 保存用户信息,Cookie 默认保存 30 天。
登录成功后跳转到 main.jsp 页面,失败则跳转到 fail.jsp。
步骤 2:设计 main.jsp 主界面,显示用户名
在 main.jsp 页面显示登录成功后的用户名。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Main Page</title>
</head>
<body>
<h2>欢迎,${sessionScope.username}</h2>
<a href="logout.jsp">登出</a>
</body>
</html>
- 解释:
使用 ${sessionScope.username} 从 session 中读取登录的用户名,并显示在主页面上。
提供一个登出链接,用户点击后会跳转到 logout.jsp 进行退出操作。
步骤 3:创建 logout.jsp 处理用户退出
用户点击登出按钮后,清除 session 和 Cookie,返回到登录页面。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="jakarta.servlet.http.Cookie" %> <!-- 使用 jakarta.servlet -->
<html>
<head><title>Logout</title>
</head>
<body>
<%// 清除 sessionsession.invalidate();// 清除 "remember me" 的 cookieCookie cookie = new Cookie("username", null);cookie.setMaxAge(0); // 设置过期时间为 0,删除 cookieresponse.addCookie(cookie); // 使用 jakarta.servlet.http.Cookie
%>
<h2>您已成功登出</h2>
<a href="login.jsp">返回登录</a>
</body>
</html>
- 解释:
通过 session.invalidate() 清除 session 信息,登出用户。
如果有保存“记住我”功能的 Cookie,使用 cookie.setMaxAge(0) 将 Cookie 删除。
登出成功后,用户可以返回登录页面。
步骤 4:实现自动登录功能(可选)
在用户访问页面时,如果存在有效的 Cookie,自动填充用户名。
在 login.jsp 页面中,增加代码检查是否有“记住我” Cookie:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="jakarta.servlet.http.Cookie" %> <!-- 使用 jakarta.servlet --><html>
<head><title>Login Page</title>
</head>
<body>
<h2>Login Page</h2>
<form action="login" method="post">用户名:<input type="text" name="username" value="<%= request.getParameter("username") != null ? request.getParameter("username") : "" %>"><br>密码:<input type="password" name="password"><br><input type="checkbox" name="rememberMe"> 记住我<br><input type="submit" value="登录">
</form><%// 检查是否有 "remember me" 的 cookieCookie[] cookies = request.getCookies();if (cookies != null) {for (Cookie cookie : cookies) {if ("username".equals(cookie.getName())) {out.println("<script>document.getElementsByName('username')[0].value='" + cookie.getValue() + "';</script>");}}}
%>
</body>
</html>
- 解释:
如果存在 username 的 Cookie,自动将其填充到用户名输入框中。
测试 Session 和 Cookie
步骤 1:登录并检查 Session 和 Cookie
第一步:填写用户名(如 admin)和密码,然后点击登录按钮。
第二步:如果登录成功,你应该被重定向到主界面(如 main.jsp)。在主界面上,你应该能够看到“欢迎,admin”,表示你已经成功登录。
检查 Session:
- 在 main.jsp 页面,你应该使用以下代码来显示当前登录的用户名:
<h2>欢迎,${sessionScope.username}</h2>
- 在服务器端,LoginServlet 中将用户名存储到 session 中:
HttpSession session = request.getSession();
session.setAttribute("username", username);
确认:如果你在登录后能够看到用户名(比如“欢迎,admin”),说明 Session 工作正常。
如图:
步骤 2:检查 Cookie
“记住我”功能:如果用户在登录时勾选了“记住我”选项,登录成功后会设置一个 Cookie 来保存用户名。你可以通过以下方法检查 Cookie 是否被设置。
检查 Cookie:
在浏览器中,右键点击页面,选择 “Inspect”(检查),进入 Application 标签页。
在左侧的 Cookies 中找到你的站点,看是否有名为 username 的 Cookie。
验证自动填写:
退出登录并关闭浏览器后,再次访问登录页面时,输入框中的用户名应该会自动填充为你之前登录时保存的用户名(例如:admin),这是因为 Cookie 保存了用户名。
如图:
2. 测试登出功能
步骤 1:退出登录
- 在主界面(main.jsp),应该有一个登出按钮链接到 logout.jsp:
<a href="logout.jsp">登出</a>
步骤 2:检查登出后是否清除 Session 和 Cookie
- 退出操作:点击登出按钮后,你应该会被重定向到一个登出页面(logout.jsp)。
在logout.jsp
中: - session.invalidate() 会清除当前的 session。
- 通过 response.addCookie(cookie) 来删除保存的 username Cookie。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="jakarta.servlet.http.Cookie" %>
<html>
<head><title>Logout</title>
</head>
<body><% // 清除 sessionsession.invalidate(); // 清除 "remember me" 的 cookieCookie cookie = new Cookie("username", null);cookie.setMaxAge(0); // 设置过期时间为 0,删除 cookieresponse.addCookie(cookie); // 使用 jakarta.servlet.http.Cookie%><h2>您已成功登出</h2><a href="login.jsp">返回登录</a>
</body>
</html>
- 确认:登出后,如果重新访问页面,Session 和 Cookie 应该都被清除,用户名不会再自动填充,用户必须重新登录。