2 #8

Merged
pc4gok3i8 merged 2 commits from branch_LYH into main 1 year ago

@ -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);
}
}
}

@ -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页面中使用<jsp:include> 包含其他页面时的请求也能被该过滤器处理编码问题
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);
}
}
}

@ -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);
}
}
}

@ -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() {}
}
}

@ -12,31 +12,42 @@ import com.hua.entity.User;
/**
* 访
* sessionuser
* 访 "/student/"
*
* sessionuser访
*/
@WebFilter(dispatcherTypes = {
DispatcherType.REQUEST,
DispatcherType.FORWARD,
DispatcherType.INCLUDE
}
, urlPatterns = { "/student/*" })
DispatcherType.REQUEST, // 拦截普通的HTTP请求也就是客户端直接发起的对 "/student/*" 路径下页面的请求都会经过此过滤器检查
DispatcherType.FORWARD, // 拦截转发请求例如在服务器内部将请求从一个Servlet转发到另一个Servlet或者JSP页面且目标页面路径在 "/student/*" 范围内时,会经过该过滤器
DispatcherType.INCLUDE // 拦截包含请求比如在JSP页面中使用 <jsp:include> 标签包含其他页面,且被包含页面路径属于 "/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);
}
}
}

@ -11,32 +11,43 @@ import javax.servlet.http.HttpServletResponse;
import com.hua.entity.User;
/**
*访
* sessionuser
* 访
* 访 "/administrator/"
* SessionUser
* 访
*/
@WebFilter(dispatcherTypes = {
DispatcherType.REQUEST,
DispatcherType.FORWARD,
DispatcherType.INCLUDE
}
, urlPatterns = { "/administrator/*" })
DispatcherType.REQUEST, // 拦截普通的请求,也就是客户端直接发起的、访问 "/administrator/*" 这类路径下页面的常规请求都会经过此过滤器来验证登录状态。
DispatcherType.FORWARD, // 拦截转发请求,例如在服务器内部进行请求转发操作,当转发的目标页面路径是以 "/administrator/" 开头时,会先经过这个过滤器进行相关检查。
DispatcherType.INCLUDE // 拦截包含请求,比如在某个页面中通过 <jsp: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);
}
}
}
Loading…
Cancel
Save