
一、Filter 过滤器是什么Filter过滤器是 Servlet 的三大组件之一Servlet、Filter、Listener。作用在请求到达目标资源之前进行拦截、预处理响应返回前进行后处理。形象理解浏览器请求 →过滤器安检→ Servlet/静态资源 → 响应返回所有web资源Servlet、JSP、HTML、CSS都可以被拦截。1.1 Filter 常见使用场景全局统一设置编码解决中文乱码登录状态拦截未登录禁止访问主页统一过滤非法字符、敏感参数权限校验、访问资源控制1.2 Filter 核心生命周期方法过滤器生命周期分为三步init()服务器启动时执行一次用于初始化doFilter()核心方法每次请求都会执行做拦截与放行destroy()服务器关闭时执行一次资源释放二、过滤器实战一全局编码过滤器万能解决乱码之前我们在每个Servlet都要写编码代码非常冗余。用过滤器一次配置全局生效。完整可直接运行代码import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException; // 拦截所有请求 WebFilter(/*) public class EncodingFilter implements Filter { Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 统一请求编码 request.setCharacterEncoding(UTF-8); // 统一响应编码 response.setContentType(text/html;charsetUTF-8); // 放行请求让请求继续访问目标资源 chain.doFilter(request, response); } }关键点chain.doFilter(request, response);代表放行不写这行代码请求会被卡住页面空白三、过滤器实战二登录权限拦截器超常用业务需求用户未登录时禁止访问首页、个人中心自动跳转到登录页。import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; WebFilter(/*) public class LoginFilter implements Filter { Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException { HttpServletRequest request (HttpServletRequest) servletRequest; HttpServletResponse response (HttpServletResponse) servletResponse; // 获取当前请求路径 String path request.getServletPath(); // 放行登录页面、登录接口 if (path.contains(/login) || path.contains(/loginServlet)) { chain.doFilter(request, response); return; } // 判断session中是否存在登录用户 HttpSession session request.getSession(); Object user session.getAttribute(user); if (user ! null) { // 已登录放行 chain.doFilter(request, response); } else { // 未登录重定向到登录页 response.sendRedirect(request.getContextPath() /login.jsp); } } }这也是企业项目中权限拦截的底层雏形。四、过滤器拦截路径规则WebFilter 常用匹配规则/*拦截所有请求最常用*.do拦截所有后缀为.do的请求/user/*拦截user下所有资源五、Listener 监听器详解Listener 监听器用来监听 Web 容器中对象的创建、销毁、属性变更自动触发对应方法。三大核心监听对象ServletContext项目全局对象整个项目唯一HttpSession用户会话对象每个用户一个ServletRequest请求对象每次请求一个5.1 项目启动监听器ServletContextListener作用项目启动初始化数据、加载配置、创建定时任务项目关闭释放资源。import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.annotation.WebListener; WebListener public class AppListener implements ServletContextListener { // 项目启动时执行 Override public void contextInitialized(ServletContextEvent sce) { System.out.println( 项目启动成功初始化资源 ); } // 项目关闭时执行 Override public void contextDestroyed(ServletContextEvent sce) { System.out.println( 项目关闭释放资源 ); } }5.2 在线人数统计监听器SessionListener经典实训案例统计当前在线用户数量import javax.servlet.ServletContext; import javax.servlet.annotation.WebListener; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; WebListener public class OnlineListener implements HttpSessionListener { // 新用户上线在线人数1 Override public void sessionCreated(HttpSessionEvent se) { ServletContext context se.getSession().getServletContext(); Integer count (Integer) context.getAttribute(onlineCount); if (count null) { count 1; } else { count; } context.setAttribute(onlineCount, count); } // 用户离线在线人数-1 Override public void sessionDestroyed(HttpSessionEvent se) { ServletContext context se.getSession().getServletContext(); Integer count (Integer) context.getAttribute(onlineCount); if (count ! null count 0) { count--; context.setAttribute(onlineCount, count); } } }在JSP/Servlet中直接获取onlineCount即可展示在线人数。六、Filter 和 Listener 核心区别总结组件作用触发时机用途Filter 过滤器拦截请求、预处理每次请求都会触发乱码处理、登录拦截、权限控制Listener 监听器监听对象状态变化对象创建/销毁时触发项目初始化、统计在线人数、资源管理七、总结1.Filter是对请求做统一拦截处理是Web开发的拦截器底层2. 全局编码、登录拦截是 Filter 最经典的实战场景3.Listener用于监听项目、会话、请求生命周期适合做初始化和数据统计4. 两个组件结合使用可以实现非常完整的 JavaWeb 基础架构。