⭐作者介绍:大二本科网络工程专业在读,持续学习Java,努力输出优质文章
⭐作者主页:@逐梦苍穹
⭐所属专栏:Java Web
写在前面:本文介绍Web三大组件之一的Filter过滤器,另外两个组件为Servlet和Listener。
Servlet链接: Servlet
Listener链接:[Java Web]Listener | 一文带你上手Web三大组件之一的listener
Filter 表示过滤器,是 JavaWeb 三大组件(Servlet、Filter、Listener)之一。
在Java Web开发中,Filter是一种常用的组件,它可以在请求到达Web应用程序的Servlet之前或之后对请求进行拦截和处理。
Filter可以用来对请求参数进行过滤、对响应结果进行加工处理、实现安全认证、记录日志等等。
过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。
如下图所示,浏览器可以访问服务器上的所有的资源(servlet、jsp、html等)
而在访问到这些资源之前可以使过滤器拦截来下,也就是说在访问资源之前会先经过 Filter,如下图
拦截器拦截到后可以做什么?
过滤器一般完成一些通用的操作。比如每个资源都要写一些代码完成某个功能,我们不可能在每一个部分都编写大量重复的代码,而此时可以将这些代码写在过滤器中,因为请求每一个资源都要经过过滤器。
如上图是使用过滤器的流程,那么便有如下问题:
● 放行后访问对应资源,资源访问完成后,还会回到Filter中吗?从上图就可以看出肯定会回到Filter中
● 如果回到Filter中,是重头执行还是执行放行后的逻辑呢?如果是重头执行,就意味着 放行前逻辑 会被执行两次,肯定不符合要求;
所以访问完资源后,会回到 放行后逻辑,执行该部分代码。
对于过滤器的执行流程,归结起来就是:
执行放行前逻辑->放行>访问相应的资源>执行放行后的逻辑
过滤器链(Filter Chain)是由多个Filter组成的链式结构,用于对HTTP请求和响应进行拦截和处理。
当一个请求到达Servlet容器时,Servlet容器会按照在web.xml中配置的顺序依次调用过滤器链中的每一个Filter,直到请求被Servlet处理或是Filter链被中断。
简单来说:过滤器链是指在一个Web应用,可以配置多个过滤器,这多个过滤器称为过滤器链。
过滤器链执行流程:
那么就有另外一个问题,要怎么判断是哪个过滤器先执行?
后面会提到过滤器具体代码怎么实现,使用的是注解配置的方式。
这种方式的优先级是按照过滤器类名的字符串的自然排序。
举个例子:
BFilterDemo和AFilterDemo,那就是AFilterDemo先执行。
FilterDemo1和FilterDemo2那就肯定是FilterDemo1先执行。
挨个比对字符串。
使用的步骤分为三步:
Java中的Filter接口定义了三个方法:init()、doFilter()和destroy(),分别用于初始化Filter、处理请求和销毁Filter。其中,doFilter()方法是Filter的核心方法,用于对请求进行拦截和处理。
在Java Web中,拦截路径的书写方式可以分为以下几种:
下面编写过滤器代码:
package com.xzl.web;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
/**
* @author 逐梦苍穹
* @date 2023/4/1 15:55
*/
@WebFilter("/*")
public class FilterDemo implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("doFilter..成功拦截");
}
@Override
public void destroy() {
Filter.super.destroy();
}
}
这里配置拦截路径为拦截所有,下面再次访问JSP:
页面什么都没有,查看控制台: