什么是Filter
Filter 表示过滤器
,是 JavaWeb 三大组件(Servlet、Filter、Listener)之一。
过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。
如下图所示,浏览器可以访问服务器上的所有的资源(servlet、jsp、html等):
而在访问到这些资源之前可以使过滤器拦截来下,也就是说在访问资源之前会先经过 Filter,如下图:
拦截器功能:
过滤器一般完成一些通用
的操作。比如每个资源都要写一些代码完成某个功能,我们总不能在每个资源中写这样的代码吧,而此时我们可以将这些代码写在过滤器中,因为请求每一个资源都要经过过滤器。例如权限管理
(比如有些资源只有在登陆过后才能查看)、 统一编码处理
、 敏感字符处理
等等…
Filter快速入门
因为Filter也是Javaweb的三大组件之一,所以它的开发步骤也与Servlet非常的类似。
步骤①:定义类,实现 Filter接口,并重写其所有方法
其中init()加载、destroy()销毁都是生命周期的相关方法。而doFilter就是过滤器的核心方法,将来每一次访问过滤器都将会被执行。
步骤②:配置Filter拦截资源的路径:在类上定义 @WebFilter
注解。
注解的 value
属性值 /*
表示拦截所有的资源
步骤③:在doFilter方法中输出一句话,并放行
上述代码中的 chain.doFilter(request,response);
就是放行,也就是让其访问本该访问的资源。
代码实现:
@WebFilter("/*")
public class FilterDemo1 implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("FilterDemo1正在运行");
chain.doFilter(req, resp);
}
public void init(FilterConfig config) throws ServletException {
}
}
如果我们不放行,也就是如下:
那么我们的页面打开是没有内容的:
Filter执行流程
Filter的执行流程如下:
同时我们还要注意:在放行之前response里面是没有数据的。所以我们一般放行前对request进行处理,放行后对response进行处理:
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("FilterDemo1正在运行");
// 放行前对req进行处理
chain.doFilter(req, resp);
// 放行后对resp进行处理
}
Filter使用细节
Filter拦截路径配置
拦截路径表示 Filter 会对请求的哪些资源进行拦截,使用 @WebFilter
注解进行配置。如:@WebFilter("拦截路径")
拦截路径有如下四种配置方式:
- 拦截具体的资源:
/index.jsp
:只有访问index.jsp时才会被拦截 - 目录拦截:
/user/*
:访问/user下的所有资源,都会被拦截 - 后缀名拦截:
*.jsp
:访问后缀名为jsp的资源,都会被拦截 - 拦截所有:
/*
:访问所有资源,都会被拦截
过滤器链
过滤器链是指在一个Web应用,可以配置多个过滤器,这多个过滤器称为过滤器链
。
如下图就是一个过滤器链:
上图中的过滤器链执行是按照以下流程执行:
- 执行
Filter1
的放行前逻辑代码 - 执行
Filter1
的放行代码 - 执行
Filter2
的放行前逻辑代码 - 执行
Filter2
的放行代码 - 访问到资源
- 执行
Filter2
的放行后逻辑代码 - 执行
Filter1
的放行后逻辑代码
以上流程串起来就像一条链子,故称之为过滤器链。
那么有一个问题就随之而来:我们怎么知道哪一个过滤器在前面,哪一个过滤器在后面呢?
我们现在使用的是注解配置Filter,而这种配置方式的优先级是按照过滤器类名(字符串)的自然排序。
比如有如下两个名称的过滤器 : BFilterDemo
和 AFilterDemo
。那一定是 AFilterDemo
过滤器先执行。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/122102.html