Filter_细节
Filter_细节
1.web.xml配置方式
<filter> <filter-name>filterDemo01</filter-name> <filter-class>com.bai.Filter.FilterDemo01</filter-class> </filter> <filter-mapping> <filter-name>filterDemo01</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
运行结果
2.过滤器执行流程
- 执行过滤器
- 执行放行后的资源
- 回来执行过滤器放行代码下边的代码
3.过滤器生命周期方法
- init:在服务器启动后 会创建Filter对象 然后调用init方法 只执行一次 用于加载资源
- doFilter:每一次请求被拦截资源时 会执行 执行多次
- destroy:在服务器关闭后 filter对象被销毁 如果服务器是正常关闭 则会执行destroy方法 只执行一次 用于释放资源
java代码
package com.bai.filter; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException; @WebFilter("/*") public class FilterDemo02 implements Filter { /** * 在服务器启动后 会创建Filter对象 然后调用init方法 * @param filterConfig * @throws ServletException */ public void init(FilterConfig filterConfig) throws ServletException { System.out.println("init...."); } /** * 每一次请求被拦截资源时 会执行 执行多次 * @param servletRequest * @param servletResponse * @param filterChain * @throws IOException * @throws ServletException */ public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("doFilter...."); //放行 filterChain.doFilter(servletRequest, servletResponse); } /** * 在服务器关闭后 filter对象被销毁 如果服务器是正常关闭 则会执行destroy方法 */ public void destroy() { System.out.println("destroy...."); } }
运行结果
4.过滤器配置详解
- 拦截路径配置
- 具体资源路径:/index.jsp:只有访问index.jsp资源 过滤器才会被执行
- 拦截目录:/user/*:访问/user下的所有资源时 过滤器都会被执行
- 后缀名拦截:*.jsp:访问所有后缀名为jsp资源时 过滤器都会被执行
- 拦截所有资源:/*:访问所有资源时 过滤器都会被执行
具体资源路径代码
@WebFilter("/index.jsp")
运行结果
拦截目录代码
FilterDemo03类
package com.bai.filter; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException; @WebFilter("/user/*")//1./index.jsp:只有访问index.jsp资源 过滤器才会被执行 public class FilterDemo03 implements Filter { public void init(FilterConfig filterConfig) throws ServletException { } public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("doFilter...."); //放行 filterChain.doFilter(servletRequest, servletResponse); } public void destroy() { } }
ServletDemo01类
package com.bai.servlet; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/user/ServletDemo01") public class ServletDemo01 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("执行了ServletDemo01类"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
ServletDemo02类
package com.bai.servlet; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/user/ServletDemo02") public class ServletDemo02 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("执行了ServletDemo02类"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
运行结果
后缀名拦截运行结果
- 拦截方式配置:资源被访问的方式
- 注解配置
- 设置dispatcherTypes属性
- REQUEST:默认值。浏览器直接请求资源
- FORWARD:转发访问资源
- INCLUDE:包含访问资源
- ERROR:错误跳转资源
- ASYNC:异步访问资源
- 设置dispatcherTypes属性
- 注解配置
java代码
FilterDemo04类
package com.bai.filter; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException; //浏览器直接请求index.jsp资源时 该浏览器会被执行 //@WebFilter(value = "/index.jsp",dispatcherTypes = DispatcherType.REQUEST) //只有转发访问index.jsp时 该过滤器才会被执行 @WebFilter(value = "/index.jsp",dispatcherTypes = DispatcherType.FORWARD) public class FilterDemo04 implements Filter { public void init(FilterConfig filterConfig) throws ServletException { } public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("FilterDemo04...."); //放行 filterChain.doFilter(servletRequest, servletResponse); } public void destroy() { } }
ServletDemo02类
package com.bai.servlet; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/user/ServletDemo02") public class ServletDemo02 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("执行了ServletDemo02类"); //转发到hello.jsp req.getRequestDispatcher("/hello.jsp").forward(req,resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
运行结果
5.过滤器链(配置多个过滤器)
- 执行顺序:如果有两个过滤器:过滤器1和过滤器2
- 过滤器1
- 过滤器2
- 资源执行
- 过滤器2
- 过滤器1
代码
package com.bai.filter; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException; @WebFilter("/*") public class FilterDemo05 implements Filter { public void init(FilterConfig filterConfig) throws ServletException { } public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { //对request对象请求消息增强 System.out.println("FilterDemo05执行了...."); //放行 filterChain.doFilter(servletRequest, servletResponse); //对response对象的响应消息增强 System.out.println("FilterDemo05回来了...."); } public void destroy() { } }
package com.bai.filter; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException; @WebFilter("/*") public class FilterDemo06 implements Filter { public void init(FilterConfig filterConfig) throws ServletException { } public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { //对request对象请求消息增强 System.out.println("FilterDemo06执行了...."); //放行 filterChain.doFilter(servletRequest, servletResponse); //对response对象的响应消息增强 System.out.println("FilterDemo06回来了...."); } public void destroy() { } }
运行结果
- 过滤器先后顺序问题
- 注解配置:按照类名的字符串比较规矩比较 值小的先执行
- AFilter和BFilter AFilter就先执行了
- web.xml配置:<filter-mapping>谁定义在上边 谁先执行
- 注解配置:按照类名的字符串比较规矩比较 值小的先执行
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)