当前位置: 首页 > news >正文

Servlet 过滤器(Filter)

一、过滤器是什么?

统一处理所有请求 / 响应,不用每个 Servlet 都写重复代码!

Servlet 过滤器 = 服务器端的 “门卫 / 拦截器”

  • 它在请求到达 Servlet 之前先拦截
  • 也可以在响应返回客户端之前再处理
  • 可以对请求、响应、会话做统一处理
  • 一个项目可以配多个过滤器,形成过滤链

二、过滤器能做什么?

  1. 统一编码设置(解决中文乱码)
  2. 登录校验(未登录不能访问)
  3. 权限控制
  4. 日志记录
  5. 请求 / 响应内容修改
  6. 压缩响应、跨域处理

三、过滤器核心接口

过滤器必须实现:javax.servlet.Filter接口

注意:必须重写 3 个方法:

  1. init():初始化(服务器启动时执行一次)
  2. doFilter()核心过滤方法(每次请求都走这里)
  3. destroy():销毁(服务器关闭时执行)

四、过滤器执行流程(超级重要)

chain.doFilter(request, response)

  • 这行代码 =放行,让请求继续往后走
  • 不写这行 =拦截,请求到此为止

五、过滤器应用

1、统一编码过滤器(解决中文乱码)

package org.hlx.javaweb3_0323; import jakarta.servlet.*; import jakarta.servlet.annotation.WebFilter; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; /** * @author : HLX * @ClassName :CharacterFilter * @date : 2026/3/24 9:26 * @Version :1.0 * @Description: TODO * @modyified By : */ @WebFilter(urlPatterns = "/*", initParams = {@jakarta.servlet.annotation.WebInitParam(name = "encoding", value = "UTF-8")}) public class CharacterFilter implements Filter { // 获取初始化参数 private String encoding; @Override public void init(FilterConfig filterConfig) throws ServletException { // 获取初始化参数 String encoding = filterConfig.getInitParameter("encoding"); if (encoding != null) { this.encoding = encoding; } System.out.println("1、字符编码过滤器初始化"); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { //类型转换 HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; //设置编码格式 request.setCharacterEncoding(encoding); response.setCharacterEncoding(encoding); response.setContentType("text/html;charset=" + encoding); //放行请求 filterChain.doFilter(servletRequest, servletResponse); System.out.println("2、字符编码过滤器执行"); } @Override public void destroy() { System.out.println("3、字符编码过滤器销毁"); } }

六、过滤器两种配置方式

1. 注解配置(最简单,推荐)

@WebFilter(urlPatterns = "/*", initParams = {@WebInitParam(name = "encoding", value = "UTF-8")})

2. web.xml 配置(传统方式)

<!-- 配置过滤器--> <filter> <filter-name>CharacterFilter</filter-name> <filter-class>org.hlx.javaweb3_0323.CharacterFilter</filter-class> <!-- 配置过滤器初始化参数--> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <!-- 配置过滤器映射--> <filter-mapping> <filter-name>CharacterFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>

七、多个过滤器执行顺序

  1. 注解:按类名字母顺序执行
  2. web.xml:按mapping 配置顺序执行

2、登录校验过滤器(未登录不能访问)

package org.hlx.javaweb3_0323; import jakarta.servlet.*; import jakarta.servlet.annotation.WebFilter; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; import java.io.IOException; /** * @author : HLX * @ClassName :LoginFilter * @date : 2026/3/24 10:19 * @Version :1.0 * @Description: TODO * @modyified By : */ // 只拦截后台管理页面 @WebFilter("/admin/*") public class LoginFilter implements jakarta.servlet.Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { // 类型转换 HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; // 获取session对象 HttpSession session = request.getSession(); // 判断是否登录 if (session.getAttribute("username") != null) { // 已登录,放行请求 filterChain.doFilter(request, response); } else { // 未登录 → 拦截,跳转到登录页 response.sendRedirect(request.getContextPath()+"/index.html"); } System.out.println("2、登录过滤器拦截" + request.getRequestURI()); } @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("1、登录过滤器初始化"); } @Override public void destroy() { System.out.println("3、登录过滤器销毁"); } }

总结

  1. Filter 是请求拦截器,统一处理请求 / 响应
  2. 必须实现Filter接口,重写doFilter
  3. chain.doFilter()= 放行
  4. 最常用:统一编码、登录验证
http://www.jsqmd.com/news/532331/

相关文章:

  • 从subprocess.CalledProcessError到Git仓库状态:解析Python子进程调用中的Git依赖陷阱
  • 突破QQ音乐格式限制:QMCDecode四步实现音乐跨设备自由
  • Windows计算器开源版:5个颠覆性功能重塑你的数字计算体验
  • PDF补丁丁完全指南:轻松掌握PDF编辑、合并与书签管理的终极解决方案
  • 告别Excel安装烦恼:AI智能操作Excel的终极解决方案
  • 2026年靠谱的环保设备/智能环保设备/资源化处理环保设备/污水环保设备厂家推荐及选择参考 - 行业平台推荐
  • 2026年全面预算管理软件推荐:多业态集团资源优化配置与智能分析热门选择 - 十大品牌推荐
  • java+vue+SpringBoot计算机学院校友网(程序+数据库+报告+部署教程+答辩指导)
  • Qwen3智能字幕对齐系统C语言文件读写实战:处理SRT、ASS等字幕格式
  • 3分钟实现手机号查QQ号:无需登录的Python实用工具
  • 3 大核心优势!抖音网红平台,KOL/KOC 一键匹配 - 博客湾
  • 2026年全面预算管理软件推荐:上市公司合规与战略落地智能预算分析与监控工具 - 十大品牌推荐
  • s2-pro效果展示:中英混读、数字朗读、标点停顿自然度实测
  • 算法刷题必备:链式前向星存图从入门到精通(附完整代码示例)
  • 合并报表软件如何选择更靠谱?2026年推荐聚焦数据治理与附注自动化工具 - 品牌推荐
  • Windows 11/10系统下SAS9.4逻辑库报错与增强编辑器丢失的终极排查手册
  • 给Raspberry Pi Pico换个“游戏机皮肤”:从零适配ST7789屏与按键的InfoNES配置指南
  • ChatTTS-究极拟真语音合成效果展示:相声式节奏与幽默感表达
  • 工业Python网关性能断崖式下跌?实测对比:asyncio+uvloop vs. Rust-Python FFI,在10万点/秒采集场景下延迟相差47ms(附压测报告PDF)
  • 深析倍思充电宝其技术优势与安全标准
  • 2026年评价高的cnc数控车床/数控车床/斜轨数控车床/精密数控车床厂家推荐及采购参考 - 行业平台推荐
  • 离网风电制氢:当风机遇见质子交换膜
  • 告别CentOS后,我在VMware上折腾Anolis OS的踩坑实录(附网络配置解决方案)
  • 鸽姆智库:“五维认知+五元资本”驱动文明级操作系统
  • Bigemap Pro必备技能:经纬度点位地址批量赋值
  • 大语言模型到底在算什么?一文搞懂 ChatGPT/DeepSeek 的工作原理
  • frp内网穿透部署详细教程
  • 2026年比较好的旱厕型移动厕所/最新款移动厕所/高品质移动厕所/道路施工移动厕所高口碑厂家推荐(评价高) - 行业平台推荐
  • ChatGPT安卓部署实战:从零搭建到性能优化的完整指南
  • 【教程】2026年3月OpenClaw(Clawdbot)京东云10分钟超简单搭建指南