JavaWeb学习——day8(MVC模式与session、cookie)

发布于:2025-06-25 ⋅ 阅读:(17) ⋅ 点赞:(0)

一、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();

    @Override
    protected 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.servlet
            if (rememberMe != null) {
                // 使用 jakarta.servlet.http.Cookie
                Cookie 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>
<%
  // 清除 session
  session.invalidate();

  // 清除 "remember me" 的 cookie
  Cookie cookie = new Cookie("username", null);
  cookie.setMaxAge(0); // 设置过期时间为 0,删除 cookie
  response.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" 的 cookie
    Cookie[] 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>
    <% 
        // 清除 session
        session.invalidate(); 
        
        // 清除 "remember me" 的 cookie
        Cookie cookie = new Cookie("username", null);
        cookie.setMaxAge(0); // 设置过期时间为 0,删除 cookie
        response.addCookie(cookie);  // 使用 jakarta.servlet.http.Cookie
    %>
    <h2>您已成功登出</h2>
    <a href="login.jsp">返回登录</a>
</body>
</html>
  • 确认:登出后,如果重新访问页面,Session 和 Cookie 应该都被清除,用户名不会再自动填充,用户必须重新登录。
  • 在这里插入图片描述

网站公告

今日签到

点亮在社区的每一天
去签到