目录
今天给大家讲解的是我最近几天刚刚学习的过滤器Filter,而这也正是Javaweb中三大组件之一,因此也是相当重要的一部分。那么过滤器的作用是什么呢?我们可以简单地将其理解为安检人员,而当我们去请求资源的时候,则需要通过安检人员的检查才可以通过,通过以后才可以去寻找我们需要的资源。具体的解释我们在后面的文章来理解吧!
方法步骤:
1、创建一个类;
2、让该类实现Filter接口;
3、复写其接口中的方法;
4、设置过滤器的拦截路径。
@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 { system.out.println("FilterDemo01被执行。。。。") } }此时我们启动服务器,访问请求资源index.jsp,可以看到这个结果:
控制台的输出表明了我们创建的过滤器FilterDemo01被执行了,而我们所访问的index.jsp并不能够成功访问,其原因就是过滤器对其拦截之后并没有对其放行,因此我们需要在拦截之后对其进行放行,需要在doFilter方法中添加一行代码“chain.doFilter(request, response);”用于对其请求的释放。此时我们再次访问资源index.jsp的结果为:
不仅在控制台显示了过滤器被执行了,并且在网页上也成功的访问了服务器的资源。这一部分可以让我们简单的了解Filter的基本知识。
对于存在多个过滤器的的时候,它会存在一个怎样的执行流程呢?接下来我们通过一个简单的案列来理解其中的奥秘吧!
此时我们来创建两个Fliter过滤器,分别命名为FilterDemo02和FilterDemo03,并在释放代码的前后分别设置输出信息,以此来表明过滤器的执行流程是什么样的。
两个代码类似于:
@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("FilterDemo02被执行。。。"); chain.doFilter(request, response); System.out.println("FilterDemo02已经释放。。。"); } }其输出结果为:
通过结果我们可以看出来,案例2、3分别执行,然而却是3比2先释放?
首先呢,过滤器链(多个过滤器)的执行顺序是根据其名称而决定的,而名称的比较规则则是比较二者名称的字符串大小,谁靠前谁先执行,因此FilterDemo02要比03先执行,而03却比02先执行的原因是因为要遵守先进后出。
通过对代码的观察我们可以看出来,其实Filter接口中的方法和我们之前学习的Servlet的方法类似,同样是具有初始化函数和销毁函数,因此我们只需要做简单的了解就足够了。
public class FilterDemo02 implements Filter { public void init(FilterConfig config) throws ServletException { //在服务器启动后,创建Filter对象,调用init()方法 } public void destroy() { //在服务器关闭后,Filter对象被销毁,如果服务器是正常关闭的,则会调用destroy()方法 } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException { chain.doFilter(request, response); } }
- 具体的资源路径:/index.jsp 只有在访问index.jsp这个资源的时候过滤器才会被执行
- 拦截目录:/user/* 访问/user下的所有资源的时候过滤器才会被执行
- 后缀名拦截:.jsp 访问后缀名为jsp的资源的时候,过滤器才会被执行
- 拦截所有资源:/ 访问所有资源,都会被拦截
具体的拦截方式就是这些,大家可以通过改变@WebFilter(" ")中的值
在@WebFilter注解中除了拦截路径value属性之外,还有另一个属性dispatcherTypes,该属性是用于决定拦截方式的,其取值共有五种,如下:
- REQUEST:默认值。浏览器直接请求资源
- FORWARD:转发访问资源
- INCLUDE:包含访问资源
- ERROR:错误跳转资源
- ASYNC:异步访问资源
其中,前面两个是经常会使用的,所以后面三个在此就不再过多的赘述,只简单地说一下前面两个,首先第一个是默认值,当你向浏览器直接请求的时候会受到过滤器的拦截,其次是第二个值,当你转发请求的时候会受到过滤器的拦截,如果不是转发请求的话,就无法受到拦截。
创作不易,给个三连