From 928bf9e4869f4207f2fc43e96312555c86a18929 Mon Sep 17 00:00:00 2001 From: LYH <2275734158@qq.com> Date: Sat, 14 Dec 2024 22:09:11 +0800 Subject: [PATCH 1/2] 1 --- .../hua/filter/AdministratorJspFilter.java | 36 ++++++++++++------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/javaweb_project/src/com/hua/filter/AdministratorJspFilter.java b/javaweb_project/src/com/hua/filter/AdministratorJspFilter.java index 422e97c..96b1bf4 100644 --- a/javaweb_project/src/com/hua/filter/AdministratorJspFilter.java +++ b/javaweb_project/src/com/hua/filter/AdministratorJspFilter.java @@ -12,30 +12,40 @@ import com.hua.entity.User; /** * Servlet Filter implementation class StudentFilter + * 这是一个Servlet过滤器类,用于拦截特定请求并进行相关处理, + * 此处类名虽然是AdministratorJspFilter,但文档注释可能还没更新过来,原本可能用于学生相关过滤(推测),现在用于管理员相关页面的过滤逻辑 */ @WebFilter(dispatcherTypes = { - DispatcherType.REQUEST, - DispatcherType.FORWARD, - DispatcherType.INCLUDE - } - , urlPatterns = { "/teacher/*" }) + DispatcherType.REQUEST, // 拦截普通的请求 + DispatcherType.FORWARD, // 拦截转发请求 + DispatcherType.INCLUDE // 拦截包含请求 +} + , urlPatterns = { "/teacher/*" }) // 配置该过滤器要拦截的URL模式,这里表示拦截以 /teacher/ 开头的所有请求路径 public class AdministratorJspFilter extends HttpFilter { @Override public void doFilter(HttpServletRequest request, - HttpServletResponse response, FilterChain filterChain) + HttpServletResponse response, FilterChain filterChain) throws IOException, ServletException { + // 从当前请求的会话(Session)中获取名为 "user" 的属性值,并将其转换为User类型对象, + // 通常这个 "user" 属性可能是在用户登录成功等操作后存入会话中的,表示当前登录用户的相关信息 User user = (User) request.getSession().getAttribute("user"); - - if(user == null){ + + if (user == null) { + // 如果获取到的用户对象为null,说明用户可能未登录或者登录已过期等情况, + // 这里创建一个提示信息字符串,表示账号已过期,需要重新登录 String message = "账号已过期,请重新登录"; - request.getSession().setAttribute("message", message); - //重定向回到登录页面 + // 将上述提示信息存入当前请求的会话中,键为 "message",方便后续在登录页面等地方获取并展示给用户 + request.getSession().setAttribute("message", message); + // 进行重定向操作,将用户的请求重定向到登录页面, + // request.getContextPath() 获取当前应用的上下文路径,然后拼接上 "/login/login.jsp" 构成完整的登录页面路径 response.sendRedirect(request.getContextPath() + "/login/login.jsp"); } - + + // 如果用户对象不为null,说明用户已登录或者会话有效, + // 则继续放行请求,让请求继续沿着过滤器链向下传递,以便后续的Servlet或其他过滤器等继续处理该请求 filterChain.doFilter(request, response); } - -} + +} \ No newline at end of file -- 2.34.1 From 7afe787cb45cb8e43fce28f65b1330b37aee9c1f Mon Sep 17 00:00:00 2001 From: LYH <2275734158@qq.com> Date: Sat, 14 Dec 2024 22:16:26 +0800 Subject: [PATCH 2/2] 2 --- .../src/com/hua/filter/EncodingFilter.java | 31 ++++---- .../com/hua/filter/FindMMCheckCodeFilter.java | 46 ++++++++---- .../src/com/hua/filter/HttpFilter.java | 71 ++++++++++++------- .../src/com/hua/filter/StudentFilter.java | 41 +++++++---- .../src/com/hua/filter/TeacherFilter.java | 43 ++++++----- 5 files changed, 150 insertions(+), 82 deletions(-) diff --git a/javaweb_project/src/com/hua/filter/EncodingFilter.java b/javaweb_project/src/com/hua/filter/EncodingFilter.java index 38887a0..e81a1db 100644 --- a/javaweb_project/src/com/hua/filter/EncodingFilter.java +++ b/javaweb_project/src/com/hua/filter/EncodingFilter.java @@ -10,26 +10,33 @@ import javax.servlet.http.HttpServletResponse; /** * 字符编号过滤器 - * 选用utf-8 + * 用于统一设置请求和响应的字符编码格式,这里选用的是utf-8编码, + * 以确保在整个Web应用中处理字符数据时避免乱码等字符编码相关问题。 */ @WebFilter(dispatcherTypes = { - DispatcherType.REQUEST, - DispatcherType.FORWARD, - DispatcherType.INCLUDE, - DispatcherType.ERROR - } - , urlPatterns = { "/*" }) + DispatcherType.REQUEST, // 拦截普通的请求,确保从客户端发来的普通请求能经过此过滤器进行编码设置 + DispatcherType.FORWARD, // 拦截转发请求,当有请求被转发时也能处理其编码相关设置 + DispatcherType.INCLUDE, // 拦截包含请求,比如在JSP页面中使用 包含其他页面时的请求也能被该过滤器处理编码问题 + DispatcherType.ERROR // 拦截错误相关的请求,例如出现页面未找到等错误情况时产生的请求也可经过此过滤器来设置编码(如果有对应页面输出等情况需要合适编码的话) +} + , urlPatterns = { "/*" }) // 配置该过滤器要拦截的URL模式,这里的 "/*" 表示拦截所有的请求路径,即应用中的任何请求都会经过这个过滤器处理 public class EncodingFilter extends HttpFilter{ - - + + @Override public void doFilter(HttpServletRequest request, - HttpServletResponse response, FilterChain filterChain) + HttpServletResponse response, FilterChain filterChain) throws IOException, ServletException { + // 设置请求对象(HttpServletRequest)的字符编码为utf-8, + // 这样当从客户端接收数据(比如表单提交的数据等)时会按照utf-8编码来解析,避免乱码问题 request.setCharacterEncoding("utf-8"); + // 设置响应对象(HttpServletResponse)的内容类型(ContentType)以及字符编码为utf-8, + // 表示返回给客户端的内容(比如HTML页面等)将以utf-8编码格式进行传输和展示,确保客户端能正确解析显示内容,避免出现乱码情况 response.setContentType("text/html;charset=utf-8"); + // 继续放行请求,让请求沿着过滤器链向下传递,以便后续的Servlet或者其他过滤器等继续处理该请求, + // 保证整个请求处理流程能够正常进行下去,而不仅仅局限于该过滤器所做的编码设置操作 filterChain.doFilter(request, response); - + } -} +} \ No newline at end of file diff --git a/javaweb_project/src/com/hua/filter/FindMMCheckCodeFilter.java b/javaweb_project/src/com/hua/filter/FindMMCheckCodeFilter.java index 1168258..663cf0c 100644 --- a/javaweb_project/src/com/hua/filter/FindMMCheckCodeFilter.java +++ b/javaweb_project/src/com/hua/filter/FindMMCheckCodeFilter.java @@ -9,30 +9,50 @@ import javax.servlet.http.HttpServletResponse; /** * 找回密码时判断验证码正不正确 + * 该过滤器用于拦截找回密码相关的请求(具体拦截路径为 /findPasswordServlet), + * 并对用户提交的验证码和服务器端保存在会话(Session)中的验证码进行比对, + * 根据比对结果决定是让请求继续处理还是重定向到相应页面提示验证码错误信息。 */ -@WebFilter("/findPasswordServlet") +@WebFilter("/findPasswordServlet") // 通过此注解配置该过滤器要拦截的具体URL路径,这里拦截的是 /findPasswordServlet 这个请求路径,通常对应找回密码相关的业务逻辑处理Servlet public class FindMMCheckCodeFilter extends HttpFilter { @Override public void doFilter(HttpServletRequest request, - HttpServletResponse response, FilterChain filterChain) + HttpServletResponse response, FilterChain filterChain) throws IOException, ServletException { - //1. 获取请求参数: CHECK_CODE_PARAM_NAME + // 1. 获取请求参数: CHECK_CODE_PARAM_NAME + // 从客户端发来的请求中获取名为 "CHECK_CODE_PARAM_NAME" 的参数值, + // 这个参数值应该就是用户在找回密码页面输入的验证码内容,不过此处参数名最好使用常量定义会更规范些,方便统一维护和修改 String paramCode = request.getParameter("CHECK_CODE_PARAM_NAME"); - - //2. 获取 session 中的 CHECK_CODE_KEY 属性值 - String sessionCode = (String)request.getSession().getAttribute("CHECK_CODE_KEY"); - - //3. 比对. 看是否一致, 若一致说明验证码正确, 若不一致, 说明验证码错误 - if(!(paramCode != null && paramCode.equalsIgnoreCase(sessionCode))){ + + // 2. 获取 session 中的 CHECK_CODE_KEY 属性值 + // 从当前请求对应的会话(Session)中获取名为 "CHECK_CODE_KEY" 的属性值, + // 这个值应该是服务器端之前生成并保存在会话中的正确验证码,用于和用户输入的验证码进行比对 + String sessionCode = (String) request.getSession().getAttribute("CHECK_CODE_KEY"); + + // 3. 比对. 看是否一致, 若一致说明验证码正确, 若不一致, 说明验证码错误 + // 对用户输入的验证码(paramCode)和服务器端会话中的验证码(sessionCode)进行比对, + // 如果两者不相等(通过先判断 paramCode 不为空且忽略大小写后相等的取反来判断不一致情况), + // 则说明用户输入的验证码错误 + if (!(paramCode!= null && paramCode.equalsIgnoreCase(sessionCode))) { + // 如果验证码不一致,将错误提示信息 "验证码不一致!" 存入当前请求的会话中,键为 "message", + // 方便后续在找回密码页面等地方获取并展示给用户,告知验证码有误 request.getSession().setAttribute("message", "验证码不一致!"); + // 同时,把用户在找回密码页面输入的用户名(通过请求参数获取)也存入会话中,键为 "username", + // 这样在重定向回找回密码页面时可以保留用户之前输入的用户名,提升用户体验 request.getSession().setAttribute("username", request.getParameter("username")); - + + // 进行重定向操作,将用户的请求重定向到找回密码页面(/login/findpassword.jsp), + // 让用户可以重新输入验证码等信息进行找回密码操作 response.sendRedirect(request.getContextPath() + "/login/findpassword.jsp"); + // 使用 return 语句结束当前方法,避免继续执行后面放行过滤器链的代码, + // 因为验证码错误的情况下不需要再让请求继续向下传递处理了 return; } - + + // 如果验证码比对一致,说明用户输入的验证码正确, + // 则继续放行请求,让请求沿着过滤器链向下传递,以便后续的Servlet或其他相关业务逻辑继续处理找回密码的请求 filterChain.doFilter(request, response); - + } -} +} \ No newline at end of file diff --git a/javaweb_project/src/com/hua/filter/HttpFilter.java b/javaweb_project/src/com/hua/filter/HttpFilter.java index 4913029..81d8898 100644 --- a/javaweb_project/src/com/hua/filter/HttpFilter.java +++ b/javaweb_project/src/com/hua/filter/HttpFilter.java @@ -1,7 +1,6 @@ package com.hua.filter; import java.io.IOException; - import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; @@ -12,18 +11,25 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** - * 自定义的 HttpFilter, 实现自 Filter 接口 - * + * 自定义的 HttpFilter,实现自 Filter 接口 + * 该类作为一个抽象类,为基于 HTTP 协议的 Servlet 过滤器提供了一个基础框架, + * 定义了一些通用的方法以及规范了子类需要实现的抽象方法,方便在具体业务场景中创建自定义的过滤器。 */ public abstract class HttpFilter implements Filter { /** - * 用于保存 FilterConfig 对象. + * 用于保存 FilterConfig 对象. + * FilterConfig 对象包含了过滤器的初始化配置信息,例如初始化参数等, + * 通过这个成员变量可以在过滤器的其他方法中获取相关配置信息来进行相应处理。 */ private FilterConfig filterConfig; - + /** * 不建议子类直接覆盖. 若直接覆盖, 将可能会导致 filterConfig 成员变量初始化失败 + * 该方法重写了 Filter 接口中的 init 方法,用于接收 FilterConfig 对象并进行初始化操作, + * 先将传入的 FilterConfig 对象赋值给类中的成员变量 filterConfig,然后调用无参的 init 方法, + * 留给子类一个机会在初始化时进行一些额外的自定义操作(通过无参 init 方法), + * 同时提醒子类不要直接重写这个有参的 init 方法,以免破坏成员变量的初始化流程。 */ @Override public void init(FilterConfig filterConfig) throws ServletException { @@ -32,50 +38,63 @@ public abstract class HttpFilter implements Filter { } /** - * 供子类继承的初始化方法. 可以通过 getFilterConfig() 获取 FilterConfig 对象. + * 供子类继承的初始化方法. 可以通过 getFilterConfig() 获取 FilterConfig 对象. + * 这个无参的 init 方法是提供给子类重写的,子类在重写时可以利用 getFilterConfig 方法获取到 FilterConfig 对象, + * 进而获取过滤器的初始化配置参数等信息,进行一些和具体业务相关的初始化操作,例如加载一些配置文件、初始化某些资源等。 */ protected void init() {} /** * 直接返回 init(ServletConfig) 的 FilterConfig 对象 + * 提供了一个对外的方法,方便子类或者其他类获取已经初始化的 FilterConfig 对象, + * 以便获取过滤器相关的配置信息来进行后续操作,比如获取初始化参数的值等。 */ public FilterConfig getFilterConfig() { return filterConfig; } - + /** - * 原生的 doFilter 方法, 在方法内部把 ServletRequest 和 ServletResponse - * 转为了 HttpServletRequest 和 HttpServletResponse, 并调用了 + * 原生的 doFilter 方法,在方法内部把 ServletRequest 和 ServletResponse + * 转为了 HttpServletRequest 和 HttpServletResponse, 并调用了 * doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) - * - * 若编写 Filter 的过滤方法不建议直接继承该方法. 而建议继承 - * doFilter(HttpServletRequest request, HttpServletResponse response, - * FilterChain filterChain) 方法 + * 此方法重写了 Filter 接口中的 doFilter 方法,它的主要作用是将传入的通用 Servlet 请求和响应对象(ServletRequest 和 ServletResponse) + * 转换为基于 HTTP 协议的请求和响应对象(HttpServletRequest 和 HttpServletResponse), + * 因为在实际的 HTTP 相关业务场景中,通常需要使用 HttpServletRequest 和 HttpServletResponse 来处理请求和响应的更多细节信息, + * 转换完成后,调用了另一个抽象的 doFilter 方法(接收 HttpServletRequest 等参数的那个), + * 该抽象方法需要由子类去具体实现针对 HTTP 请求的过滤逻辑, + * 同时也提醒了编写过滤器的过滤方法时不建议直接继承这个方法,而是建议继承后面那个专门针对 HTTP 请求定制的 doFilter 方法。 */ @Override public void doFilter(ServletRequest req, ServletResponse resp, - FilterChain chain) throws IOException, ServletException { + FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) resp; - + doFilter(request, response, chain); } - + /** - * 抽象方法, 为 Http 请求定制. 必须实现的方法. - * @param request - * @param response - * @param filterChain - * @throws IOException - * @throws ServletException + * 抽象方法,为 Http 请求定制. 必须实现的方法. + * 这个抽象方法是留给子类去具体实现的,它定义了针对 HTTP 请求进行过滤处理的逻辑框架, + * 子类需要根据具体的业务需求,在这个方法中编写代码来实现诸如请求拦截、验证、修改请求/响应内容等过滤操作, + * 例如检查用户权限、验证请求参数、设置响应头信息等,然后根据情况决定是否放行请求(通过调用 filterChain.doFilter 方法)。 + * @param request 基于 HTTP 协议的请求对象,包含了请求的各种详细信息,如请求头、请求参数等,子类可以利用这些信息进行过滤判断。 + * @param response 基于 HTTP 协议的响应对象,子类可以设置响应的内容类型、状态码、响应头以及向客户端输出内容等操作。 + * @param filterChain 过滤器链对象,用于将请求传递给下一个过滤器或者最终的目标 Servlet,子类在完成自身的过滤逻辑后, + * 根据情况调用 filterChain.doFilter 方法来放行请求,让请求继续处理流程。 + * @throws IOException 如果在处理请求或响应的输入输出操作过程中出现 I/O 异常时抛出该异常。 + * @throws ServletException 如果在 Servlet 相关的处理过程中(如调用 Servlet 方法等)出现异常时抛出该异常。 */ - public abstract void doFilter(HttpServletRequest request, HttpServletResponse response, - FilterChain filterChain) throws IOException, ServletException; + public abstract void doFilter(HttpServletRequest request, HttpServletResponse response, + FilterChain filterChain) throws IOException, ServletException; /** - * 空的 destroy 方法。 + * 空的 destroy 方法。 + * 该方法重写了 Filter 接口中的 destroy 方法,目前方法体为空, + * 主要是留给子类在过滤器销毁时(例如 Web 应用关闭等情况)进行一些资源释放、清理等操作的, + * 子类可以根据实际情况重写这个方法来实现相应的销毁逻辑,比如关闭数据库连接、释放文件资源等。 */ @Override public void destroy() {} -} +} \ No newline at end of file diff --git a/javaweb_project/src/com/hua/filter/StudentFilter.java b/javaweb_project/src/com/hua/filter/StudentFilter.java index 150a1e7..091ef7b 100644 --- a/javaweb_project/src/com/hua/filter/StudentFilter.java +++ b/javaweb_project/src/com/hua/filter/StudentFilter.java @@ -12,31 +12,42 @@ import com.hua.entity.User; /** * 访问学生用户下的所有页面的过滤器 - * 当session中的user丢失,即需要重新登录 + * 该过滤器用于拦截访问以 "/student/" 开头路径下的所有页面请求, + * 目的是检查当前用户的登录状态(通过查看会话中的用户信息), + * 当session中的user丢失,即需要重新登录,以确保只有登录后的学生用户能正常访问相关页面。 */ @WebFilter(dispatcherTypes = { - DispatcherType.REQUEST, - DispatcherType.FORWARD, - DispatcherType.INCLUDE - } - , urlPatterns = { "/student/*" }) + DispatcherType.REQUEST, // 拦截普通的HTTP请求,也就是客户端直接发起的对 "/student/*" 路径下页面的请求都会经过此过滤器检查 + DispatcherType.FORWARD, // 拦截转发请求,例如在服务器内部将请求从一个Servlet转发到另一个Servlet或者JSP页面,且目标页面路径在 "/student/*" 范围内时,会经过该过滤器 + DispatcherType.INCLUDE // 拦截包含请求,比如在JSP页面中使用 标签包含其他页面,且被包含页面路径属于 "/student/*" 时,此过滤器会介入处理 +} + , urlPatterns = { "/student/*" }) // 配置该过滤器要拦截的URL模式,这里指定拦截所有以 "/student/" 开头的请求路径,意味着只要是访问学生相关页面的请求都会被拦截检查 public class StudentFilter extends HttpFilter { @Override public void doFilter(HttpServletRequest request, - HttpServletResponse response, FilterChain filterChain) + HttpServletResponse response, FilterChain filterChain) throws IOException, ServletException { + // 尝试从当前请求对应的会话(Session)中获取名为 "user" 的属性值,并将其转换为 User 类型对象。 + // 通常情况下,在用户成功登录后,系统会将代表用户信息的 User 对象存储在会话中,这里就是获取该对象来判断用户是否处于登录状态。 User user = (User) request.getSession().getAttribute("user"); - - if(user == null){ + + if (user == null) { + // 如果获取到的用户对象为 null,说明用户可能未登录或者之前的登录已过期(例如长时间未操作导致会话失效等情况), + // 此时创建一个提示信息字符串,表示账号已过期,需要重新登录,用于后续展示给用户知晓当前登录状态异常。 String message = "账号已过期,请重新登录"; - request.getSession().setAttribute("message", message); - //重定向回到登录页面 + // 将上述提示信息存入当前请求的会话中,键为 "message",方便在重定向后的登录页面等地方获取并展示该提示信息给用户,让用户了解为何被要求重新登录。 + request.getSession().setAttribute("message", message); + // 进行重定向操作,将用户的请求重定向到登录页面, + // request.getContextPath() 获取的是当前Web应用的上下文路径(例如,应用部署在服务器的 "/myapp" 路径下,这里就获取到 "/myapp"), + // 然后拼接上 "/login/login.jsp" 构成完整的登录页面路径,引导用户前往登录页面重新进行登录操作。 response.sendRedirect(request.getContextPath() + "/login/login.jsp"); + } else { + // 如果用户对象不为 null,说明用户当前处于登录状态, + // 则继续放行请求,让请求沿着过滤器链向下传递,以便后续的Servlet或其他过滤器等继续处理该请求,保证正常的页面访问流程能够继续进行下去,例如加载并展示学生相关页面内容等。 + filterChain.doFilter(request, response); } - - filterChain.doFilter(request, response); } - -} + +} \ No newline at end of file diff --git a/javaweb_project/src/com/hua/filter/TeacherFilter.java b/javaweb_project/src/com/hua/filter/TeacherFilter.java index 3769e50..b890b20 100644 --- a/javaweb_project/src/com/hua/filter/TeacherFilter.java +++ b/javaweb_project/src/com/hua/filter/TeacherFilter.java @@ -11,32 +11,43 @@ import javax.servlet.http.HttpServletResponse; import com.hua.entity.User; /** - *访问教师用户下的所有页面的过滤器 - * 当session中的user丢失,即需要重新登录 + * 访问教师用户下的所有页面的过滤器 + * 此过滤器的作用是拦截所有访问以 "/administrator/" 开头路径的页面请求, + * 通过检查会话(Session)中存储的用户信息(User对象)来判断教师用户的登录状态, + * 一旦发现会话中的用户信息丢失,意味着用户需要重新登录才能继续访问相应页面。 */ @WebFilter(dispatcherTypes = { - DispatcherType.REQUEST, - DispatcherType.FORWARD, - DispatcherType.INCLUDE - } - , urlPatterns = { "/administrator/*" }) + DispatcherType.REQUEST, // 拦截普通的请求,也就是客户端直接发起的、访问 "/administrator/*" 这类路径下页面的常规请求都会经过此过滤器来验证登录状态。 + DispatcherType.FORWARD, // 拦截转发请求,例如在服务器内部进行请求转发操作,当转发的目标页面路径是以 "/administrator/" 开头时,会先经过这个过滤器进行相关检查。 + DispatcherType.INCLUDE // 拦截包含请求,比如在某个页面中通过 等方式包含了以 "/administrator/" 开头路径的其他页面内容时,此过滤器也会介入进行登录状态的验证。 +} + , urlPatterns = { "/administrator/*" }) // 配置该过滤器要拦截的URL模式,这里明确指定了要拦截所有以 "/administrator/" 开头的请求路径,以此来管控教师用户相关页面的访问权限。 public class TeacherFilter extends HttpFilter { @Override public void doFilter(HttpServletRequest request, - HttpServletResponse response, FilterChain filterChain) + HttpServletResponse response, FilterChain filterChain) throws IOException, ServletException { + // 从当前请求对应的会话(Session)中尝试获取名为 "user" 的属性值,并将其转换为 User 类型的对象。 + // 正常情况下,教师用户登录成功后,系统会把代表该教师用户的相关信息封装在 User 对象里,并存放在会话中,这里就是获取该对象用于判断登录状态。 User user = (User) request.getSession().getAttribute("user"); - - if(user == null){ + + if (user == null) { + // 如果获取到的 "user" 对象为 null,说明可能存在用户未登录或者之前的登录已过期的情况(比如长时间没有操作,导致会话失效等原因), + // 此时创建一个提示信息字符串,表示账号已过期,需要重新登录,这个信息后续会展示给用户,让其明白为何被要求重新登录。 String message = "账号已过期,请重新登录"; - request.getSession().setAttribute("message", message); - //重定向回到登录页面 + // 将上述提示信息存入当前请求的会话中,使用 "message" 作为键,方便在后续重定向到登录页面时,登录页面能够获取并展示这个提示信息给用户。 + request.getSession().setAttribute("message", message); + // 进行重定向操作,把用户的请求重定向到登录页面。 + // 其中,request.getContextPath() 获取的是当前Web应用在服务器上部署的上下文路径(例如应用部署在服务器的 "/mywebapp" 路径下,这里就获取到 "/mywebapp"), + // 再拼接上 "/login/login.jsp" ,就构成了完整的登录页面的访问路径,引导用户前往登录页面重新进行登录操作。 response.sendRedirect(request.getContextPath() + "/login/login.jsp"); + } else { + // 如果获取到的 "user" 对象不为 null,那就说明教师用户当前处于登录状态, + // 此时可以继续放行请求,让请求沿着过滤器链向下传递,这样后续的Servlet或者其他过滤器等就能继续对该请求进行相应处理,保障教师用户能正常访问相关页面,比如加载并展示教师用户专属页面的内容等。 + filterChain.doFilter(request, response); } - - filterChain.doFilter(request, response); } - -} + +} \ No newline at end of file -- 2.34.1