简单介绍
@WebFilter注解是JavaEE中的一种注解,用于标识一个类为过滤器(Filter)。过滤器用于对请求进行过滤和处理,可以在请求到达目标资源之前或之后执行一些操作。
使用**@WebFilter**注解可以将一个类声明为过滤器,并指定过滤器的名称、URL模式、Servlet名称等。
优势
简化配置:不再需要在web.xml文件中手动配置过滤器,而是通过注解直接配置在过滤器类上。
可读性高:注解方式可以将过滤器的相关信息直接写在过滤器类上,使得代码更加简洁和可读。
方便管理:通过注解方式,可以更方便地管理和组织过滤器,减少了配置文件的复杂性。
方法
@WebFilter注解提供了以下属性来配置过滤器:
filterName:指定过滤器的名称,可选属性。
urlPatterns:指定过滤器拦截的URL模式,可以是一个字符串数组,表示多个URL模式。
value:urlPatterns的别名属性,可以用来指定过滤器拦截的URL模式。
servletNames:指定过滤器拦截的Servlet名称,可以是一个字符串数组,表示多个Servlet名称。
dispatcherTypes:指定过滤器的调度类型,可以是DispatcherType枚举类型的数组,默认为REQUEST。
asyncSupported:指定过滤器是否支持异步请求,默认为false。
initParams:指定过滤器的初始化参数,以@WebInitParam注解的数组形式提供。
过滤器原理
当我们使用过滤器时,过滤器会对游览器的请求进行过滤,过滤器可以动态的分为3个部分,1.放行之前的代码,2.放行,3.放行后的代码,这3个部分分别会发挥不同作用
第一部分代码会对游览器请求进行第一次过滤,然后继续执行
第二部分代码就是将游览器请求放行,如果还有过滤器,那么就继续交给下一个过滤器
第三部分代码就是对返回的Web资源再次进行过滤处理
创建过滤器
创建MyFilter,只需要实现Filter接口就行,并且加一个WebFIlter注解
代码演示
Filter的三个阶段就对应着Filter的3个方法,init方法会在Filter创建时调用,doFilter方法会在请求和拦截匹配时调用,destroy方法会在Filter销毁时调用。
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import java.io.IOException;
@WebFilter(initParams = {@WebInitParam(name = "aaa", value = "sss")})
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("调用01过滤器");
String aaa = filterConfig.getInitParameter("aaa");
System.out.println(aaa);
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("对01 request 进行过滤");
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("对01 response 过滤");
}
@Override
public void destroy() {
System.out.println("01 调用了destroy方法");
}
}
启动服务器控制台输出
进行拦截时控制台输出
关闭服务器控制台输出 **
到此,我们就成功验证了Filter的生命周期。 filterConfig.getInitParameter()是获取我们注解配置得参数值value。根据上面图解,大家可能会有个疑问为什么会有02**这个过滤器。那我们接下来就讲一下。
多个过滤器
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter("/*")
public class MyFilter2 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("调用02过滤器");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("对02 request 进行过滤");
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("对02 response 过滤");
}
@Override
public void destroy() {
System.out.println("02 调用了destroy方法");
}
}
我们可以看见Filter01先进行过滤,然后交给Filter02,然后访问资源,然后Filter02对响应进行过滤,然后Filter01对响应进行过滤。
文章来源:https://www.toymoban.com/news/detail-770961.html
多个Filter的执行顺序
如果我们是使用@WebFilter进行配置的,那么执行顺序就是字符比较顺序来执行,例如有2个过滤器,一个是AFilter,一个是BFilter,那么AFilter就会先执行。文章来源地址https://www.toymoban.com/news/detail-770961.html
到了这里,关于Java 过滤器 @WebFilter 详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!