提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
Filter表示过滤器,是Java Web三大组件(Servlet Filter(过滤器) Listener(监听器))之一。
过滤器可以把对资源的请求==拦截==下来,从而实现一些特殊的功能。
一、Filter过滤器概述
如下图所示,浏览器可以访问服务器上的所有的资源(servlet jsp html等)
而在访问到这些资源之前可以使过滤器拦截来下,也就是说在访问资源之前会先经过 Filter,如下图
拦截器拦截到后可以做什么功能呢?
==过滤器一般完成一些通用的操作。
- 中文编码转换
- 敏感词
- 权限控制(权限认证)
<-比如每个资源都要写一些代码完成某个功能我们总不能在每个资源中写这样的代码吧,而此时我们可以将这些代码写在过滤器中,因为请求每一个资源都要经过过滤器。->
二、Filter执行流程
执行放行前逻辑 ---->放行- ---->访问资源 ---->执行放行后逻辑
接下来我们通过代码验证一下,在do Filter方法前后都加上输出语句,如下
以后我们可以将对请求进行处理的代码放在放行之前进行处理,而如果请求完资源后还要对响应的数据进行处理时可以在放行后进行逻辑处理。
执行代码
public class Filter01 implements Filter {
public void init(FilterConfig config) throws ServletException {
}
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
System.out.println("1、访问Web资源前执行到过过滤器");
chain.doFilter(request, response);
System.out.println("3、访问Web资源后执行到过过滤器");
}
}
三、Filter拦截路径
拦截路径表示Filter会对请求的哪些资源进行拦截,使用@Web Filter 注解进行配置。如: @web Filter(“拦截路径")
拦截路径有如下四种配置方式:
- 拦截具体的资源:/hello.jsp;只有访问hello.jsp时才会被拦截
- 目录拦截:/user/*·访问/user下的所有资源,都会被拦截。
- 后缀名拦截:*isp:访问后缀名为isp的资源,都会被拦截
- 拦截所有:/*:访问所有资源,都会被拦截
通过上面拦截路径的学习,大家会发现拦截路径的配置方式和Servlet 的请求资源路径配置方式一样,但是表示的含义不同。
四、过滤器链
概述
过滤器链是指在一个Web应用,可以配置多个过滤器,这多个过滤器称为过滤器链如下图就是一个过滤器链,我们学习过滤器链主要是学习过滤器链执行的流程
过滤器链执行流程
1.执行 Filter1 的放行前逻辑代码
2.执行 Filter1 的放行代码
3.执行 Filter2 的放行前逻辑代码
4.执行 Filter2 的放行代码
5.访问到资源
6.执行 Filter2 的放行后逻辑代码
7.执行Filter1 的放行后逻辑代码
以上流程串起来就像一条链子,故称之为过滤器链。
执行代码
FilterDemo01
@WebFilter("/*")
public class FilterDemo01 implements Filter {
public void init(FilterConfig config) throws ServletException {
}
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
//1、在放行前,对request数据处理
System.out.println("1.before open...");
//2、放行
chain.doFilter(request, response);
//3、放行后,对response数据进行处理
System.out.println("5.after open...");
}
}
FilterDemo02
@WebFilter("/*")
public class FilterDemo02 implements Filter {
public void init(FilterConfig config) throws ServletException {
}
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
System.out.println("2.before open....");
chain.doFilter(request, response);
System.out.println("4.after open....");
}
}
五、问题
上面代码中为什么是先执行Filter Demo,后执行FilterDemo2呢?
我们现在使用的是注解配置Filter,而这种配苦方式的优先级是按照过滤器类名(字符串)的自然排序。
例如:有两个名称的过滤器:" B Filter Demo和A filter Demo。那一定是 A Filter Demo过滤器先执行。
将css样式引入jsp中
<link href="css/login.css" rel="stylesheet">