Servlet 过滤器(Filter)
一、过滤器是什么统一处理所有请求 / 响应不用每个 Servlet 都写重复代码Servlet 过滤器 服务器端的 “门卫 / 拦截器”它在请求到达 Servlet 之前先拦截也可以在响应返回客户端之前再处理可以对请求、响应、会话做统一处理一个项目可以配多个过滤器形成过滤链二、过滤器能做什么统一编码设置解决中文乱码登录校验未登录不能访问权限控制日志记录请求 / 响应内容修改压缩响应、跨域处理三、过滤器核心接口过滤器必须实现javax.servlet.Filter接口注意必须重写 3 个方法init()初始化服务器启动时执行一次doFilter()核心过滤方法每次请求都走这里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-nameCharacterFilter/filter-name filter-classorg.hlx.javaweb3_0323.CharacterFilter/filter-class !-- 配置过滤器初始化参数-- init-param param-nameencoding/param-name param-valueUTF-8/param-value /init-param /filter !-- 配置过滤器映射-- filter-mapping filter-nameCharacterFilter/filter-name url-pattern/*/url-pattern /filter-mapping七、多个过滤器执行顺序注解按类名字母顺序执行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、登录过滤器销毁); } }总结Filter 是请求拦截器统一处理请求 / 响应必须实现Filter接口重写doFilterchain.doFilter() 放行最常用统一编码、登录验证
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2446826.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!