编程自学指南:java程序设计开发,JavaWeb Servlet 与Filter 、Listener、SpringMVC协作学习笔记
Servlet 与Filter
一、核心概念与生活类比
定义:
- Servlet:处理请求的核心组件(如处理用户登录、查询数据)
- Filter:请求的 “过滤器”,在请求到达 Servlet 前预处理,或在响应返回后后处理
生活类比:
- Filter → 超市安检(检查顾客是否戴口罩)
- Servlet → 收银员(处理购物结算)
- 协作:安检通过后,顾客才能找收银员结算
二、协作流程与案例
1. 请求预处理
场景:统一设置字符编码
Filter 代码:
@WebFilter("/*")
public class EncodingFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
req.setCharacterEncoding("UTF-8"); // 预处理请求
res.setContentType("text/html;charset=UTF-8"); // 预处理响应
chain.doFilter(req, res); // 放行到 Servlet
}
}
2. 权限验证
场景:只有登录用户才能访问 /admin
路径
Filter 代码:
@WebFilter("/admin/*")
public class AuthFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
if (request.getSession().getAttribute("user") == null) {
((HttpServletResponse) res).sendRedirect("/login.jsp");
return;
}
chain.doFilter(req, res); // 放行到 Servlet
}
}
3. 响应后处理
场景:记录请求处理时间
Filter 代码:
@WebFilter("/*")
public class LogFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
long start = System.currentTimeMillis();
chain.doFilter(req, res); // 先执行 Servlet
long end = System.currentTimeMillis();
System.out.println("请求处理时间:" + (end - start) + "ms");
}
}
三、Filter 核心知识点
1. 生命周期
- init():初始化(仅一次,如加载配置)
- doFilter():处理请求(每次请求触发)
- destroy():销毁(释放资源)
2. 链式调用
流程:
Filter1 → Filter2 → Servlet → Filter2 → Filter1
案例:
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {
System.out.println("Filter1 预处理");
chain.doFilter(req, res); // 执行下一个 Filter 或 Servlet
System.out.println("Filter1 后处理");
}
3. 配置方式
注解配置(Servlet 3.0+)
@WebFilter(urlPatterns = "/*", initParams = {
@WebInitParam(name = "encoding", value = "UTF-8")
})
public class EncodingFilter implements Filter { ... }