目录
一、基本介绍
二、Filter的生命周期
三、FilterConfig
四、FilterChain过滤链
五、FilterChain注意事项和细节
六、总结
在此之前,你也可以了解一下我以往的文章👇👇👇
| Servlet的入门 | Servlet的入门 |
| Jquery | Jquery |
拦截请求,过滤响应

Filter接口提供了三个方法,用来处理我们的业务
📌web.xml文件
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<filter>
<filter-name>myFilterfilter-name>
<filter-class>com.jl.MyFilterfilter-class>
filter>
<filter-mapping>
<filter-name>myFilterfilter-name>
<url-pattern>/test03url-pattern>
filter-mapping>
web-app>
url-pattern配置的是拦截路径📌Filter
package com.jl;
import javax.servlet.*;
import java.io.IOException;
/**
* @author long
* @date 2022/9/12
*/
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("初始化完成");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("前置处理");
doFilter(servletRequest, servletResponse, filterChain);
System.out.println("后置处理");
}
@Override
public void destroy() {
System.out.println("销毁");
}
}
Filter的生命周期分别对应Filter接口的三个方法
init():当web工程启动时,会执行构造器和init方法。doFilter():当浏览器请求Tomcat的时候,如果匹配到Filter设置的url-pattern,doFilter()方法就会被调用。destroy():停止web工程的时候,销毁Filter实例,就会调用destroy()。FilterConfig是Filter过滤器的配置类。示例:
📌web.xml文件
<filter>
<filter-name>myFilterfilter-name>
<filter-class>com.jl.MyFilterfilter-class>
filter>
<filter-mapping>
<filter-name>myFilterfilter-name>
<url-pattern>/test03url-pattern>
filter-mapping>
📌Filter
package com.jl;
import javax.servlet.*;
import java.io.IOException;
/**
* @author long
* @date 2022/9/12
*/
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 这里可以获取到配置信息
String user = filterConfig.getInitParameter("user");
String filterName = filterConfig.getFilterName();
ServletContext servletContext = filterConfig.getServletContext();
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
}
@Override
public void destroy() {
System.out.println("销毁");
}
}
在处理某些复杂业务时,一个过滤器不够,可以设计多个过滤器共同完成过滤任务,形成过滤器链。

📌web.xml配置文件
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>myServlet02servlet-name>
<servlet-class>com.jl.MyServlet02servlet-class>
servlet>
<servlet-mapping>
<servlet-name>myServlet02servlet-name>
<url-pattern>/test02url-pattern>
servlet-mapping>
<filter>
<filter-name>Afilterfilter-name>
<filter-class>com.jl.AFilterfilter-class>
filter>
<filter-mapping>
<filter-name>Afilterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
<filter>
<filter-name>Bfilterfilter-name>
<filter-class>com.jl.BFilterfilter-class>
filter>
<filter-mapping>
<filter-name>Bfilterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
web-app>
📌 AFilter 代码
package com.jl;
import javax.servlet.*;
import java.io.IOException;
/**
* @author long
* @date 2022/9/12
*/
public class AFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("AFilter前置通知");
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("AFilter后置通知");
}
@Override
public void destroy() {
}
}
📌 BFilter 代码
package com.jl;
import javax.servlet.*;
import java.io.IOException;
/**
* @author long
* @date 2022/9/12
*/
public class BFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("BFilter前置通知");
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("BFilter后置通知");
}
@Override
public void destroy() {
}
}
📌 MyServlet02 调用代码
package com.jl;
import com.sun.javafx.property.adapter.PropertyDescriptor;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
/**
* @author long
* @date 2022/9/8
*/
public class MyServlet02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("ok");
}
@Override
protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
👇运行结果
AFilter前置通知
BFilter前置通知
ok
BFilter后置通知
AFilter后置通知
同一个线程中。url-pattern匹配时, 才会被执行, 如果有多个匹配上,就会顺序执行,形成一个filter调用链。💡小结:
注意执行过滤器链时, 顺序是(用前面的案例分析) Http请求→ A 过滤器 dofilter()→A 过滤器前置代码→A 过滤chain.doFilter() →B 过滤器 dofilter() →B 过滤器前置代码→ B过滤器 chain.doFilter()→ 目标文件→B过滤器后置代码→A过滤器后置代码 →返回给浏览器页面/数据。
以上就是
过滤器的全部内容,只是很浅显介绍了一下过滤器的使用,目的是帮助大家快速了解过滤器的作用。如果文章有描述不正确或者错误的地方,还望指正。您可以留言📫或者私信我。🙏
最后希望大家多多 关注+点赞+收藏^_^,你们的鼓励是我不断前进的动力!!!
感谢感谢~~~🙏🙏🙏