一、邮件登录系统的核心流程
整体流程可以理解成:
login.jsp 用户输入用户名和密码 ↓ LoginServlet 接收表单参数,判断用户名密码是否正确 ↓ 正确:保存 session,跳转到 main.jsp 错误:跳回 login.jsp,提示错误 ↓ 访问 inbox.jsp / send.jsp / user.jsp 等页面 先判断 session 中有没有登录用户 ↓ 有:允许访问 没有:跳回 login.jsp二、登录页面 login.jsp
这个页面负责让用户输入用户名和密码。
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>邮件系统登录</title> </head> <body> <h2>邮件登录系统</h2> <form action="LoginServlet" method="post"> 用户名:<input type="text" name="username"><br><br> 密码:<input type="password" name="password"><br><br> <input type="submit" value="登录"> </form> <% String msg = (String) request.getAttribute("msg"); if (msg != null) { %> <p style="color:red;"><%= msg %></p> <% } %> </body> </html>重点记住:
<form action="LoginServlet" method="post">表示表单会提交到LoginServlet。
name="username" name="password"这两个name很重要,Servlet 里要靠它们接收数据。
三、登录处理 LoginServlet
这是整个系统最关键的代码。
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.*; import java.io.IOException; @WebServlet("/LoginServlet") public class LoginServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); // 1. 接收表单参数 String username = request.getParameter("username"); String password = request.getParameter("password"); // 2. 判断用户名和密码 if ("admin".equals(username) && "123456".equals(password)) { // 3. 登录成功,把用户信息保存到 session HttpSession session = request.getSession(); session.setAttribute("loginUser", username); // 4. 跳转到主页面 response.sendRedirect("main.jsp"); } else { // 5. 登录失败,保存错误信息 request.setAttribute("msg", "用户名或密码错误"); // 6. 转发回登录页面 request.getRequestDispatcher("login.jsp").forward(request, response); } } }四、这段代码必须会解释
1. 接收表单参数
String username = request.getParameter("username"); String password = request.getParameter("password");含义:
从前端表单中获取用户输入的数据。
注意:
request.getParameter()返回值永远是String类型,不是int。
2. 判断用户名密码
if ("admin".equals(username) && "123456".equals(password)) {这里表示:
用户名是admin,密码是123456,就算登录成功。
为什么写成:
"admin".equals(username)而不是:
username.equals("admin")因为如果username是null,后者可能会空指针异常。
3. 保存登录状态
HttpSession session = request.getSession(); session.setAttribute("loginUser", username);这两行是登录系统最重要的代码。
含义:
服务器给当前用户创建一个session,并在里面保存登录用户信息。
只要 session 还在,系统就认为这个用户已经登录。
4. 登录成功跳转
response.sendRedirect("main.jsp");这是客户端跳转。
特点:
地址栏会改变 会重新发起一次请求 request 中的数据会丢失 session 中的数据不会丢失所以登录成功后通常用sendRedirect。
5. 登录失败转发
request.setAttribute("msg", "用户名或密码错误"); request.getRequestDispatcher("login.jsp").forward(request, response);这是服务器端转发。
特点:
地址栏不变 属于一次请求 request 中的数据可以保留所以登录失败后要把错误信息带回登录页面,适合用forward。
五、主页面 main.jsp
登录成功后进入主页面。
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <% String loginUser = (String) session.getAttribute("loginUser"); if (loginUser == null) { response.sendRedirect("login.jsp"); return; } %> <html> <head> <title>邮件系统首页</title> </head> <body> <h2>欢迎进入邮件系统</h2> <p>当前登录用户:<%= loginUser %></p> <a href="inbox.jsp">收件箱</a><br> <a href="send.jsp">写邮件</a><br> <a href="LogoutServlet">退出登录</a> </body> </html>核心代码是:
String loginUser = (String) session.getAttribute("loginUser"); if (loginUser == null) { response.sendRedirect("login.jsp"); return; }意思是:
如果 session 中没有登录用户,说明没有登录,直接跳回登录页。
六、权限页面 inbox.jsp / send.jsp
比如收件箱页面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <% String loginUser = (String) session.getAttribute("loginUser"); if (loginUser == null) { response.sendRedirect("login.jsp"); return; } %> <html> <head> <title>收件箱</title> </head> <body> <h2>收件箱</h2> <p>当前用户:<%= loginUser %></p> <ul> <li>张三:你好,明天开会。</li> <li>李四:作业已经提交。</li> <li>王五:请查收附件。</li> </ul> <a href="main.jsp">返回首页</a> </body> </html>这种页面属于“隐私页面”,必须判断登录状态。
PPT 里说的:
隐私页面内容阅读完即关闭本质就是:
没有登录不能访问; 访问完要关闭或退出; 防止别人直接通过地址栏访问。七、退出登录 LogoutServlet
退出登录就是销毁 session。
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.*; import java.io.IOException; @WebServlet("/LogoutServlet") public class LogoutServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); // 销毁 session,清除登录状态 session.invalidate(); // 跳回登录页面 response.sendRedirect("login.jsp"); } }重点代码:
session.invalidate();含义:
销毁当前用户的 session,相当于退出登录。
八、考试最容易考的代码点
1. 接收表单数据
String username = request.getParameter("username");2. 保存登录状态
HttpSession session = request.getSession(); session.setAttribute("loginUser", username);3. 获取登录状态
String loginUser = (String) session.getAttribute("loginUser");4. 判断是否登录
if (loginUser == null) { response.sendRedirect("login.jsp"); return; }5. 退出登录
session.invalidate();6. 客户端跳转
response.sendRedirect("main.jsp");7. 服务器端转发
request.getRequestDispatcher("login.jsp").forward(request, response);九、可以直接背的标准解释
邮件登录系统的核心是利用session保存用户登录状态。用户在login.jsp输入用户名和密码后,表单提交给LoginServlet。Servlet 通过request.getParameter()获取用户名和密码,并进行校验。校验成功后,使用session.setAttribute()保存当前登录用户,然后通过response.sendRedirect()跳转到系统首页。对于收件箱、写邮件等隐私页面,需要先通过session.getAttribute()判断用户是否已经登录,如果没有登录,则重定向回登录页面。用户退出系统时,通过session.invalidate()销毁 session,从而清除登录状态。
重点:
request.getParameter():接收表单参数 session.setAttribute():保存登录状态 session.getAttribute():获取登录状态 session.invalidate():退出登录 response.sendRedirect():客户端跳转 forward():服务器端转发期末如果考程序设计题,大概率就是让你写一个登录验证 Servlet + session 权限判断页面。