过滤器Filter入门(参考传智黑马)全是干货!

过滤器

  • 一、过滤器概述
    • 图形化解释
  • 过滤器
    • 过滤器的配置方法
      • 基于注解方式配置
      • 基于XML方式
    • 过滤器执行流程
    • 过滤器生命周期
    • 过滤器配置
      • 拦截路径配置
      • 拦截方式配置
        • 注解配置
        • web.xml配置
    • 过滤器链(配置多个过滤器)
      • 执行顺序
      • 过滤器先后顺序

一、过滤器概述

过滤器是一个程序,它先于与之相关的servlet或JSP页面运行在服务器上。过滤器可附加到一个或多个servlet或JSP页面上,并且可以检查进入这些资源的请求信息。在这之后,过滤器可以作如下的选择:
①以常规的方式调用资源(即,调用servlet或JSP页面)。
②利用修改过的请求信息调用资源。
③调用资源,但在发送响应到客户机前对其进行修改。
④阻止该资源调用,代之以转到其他的资源,返回一个特定的状态代码或生成替换输出。

图形化解释

检查
满足
不满足
客户端
发送请求
过滤器
是否满足通过条件
访问servlet容器
拦截请求

过滤器

过滤器的配置方法

基于注解方式配置

package cn.Filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

@WebFilter("/*") //访问所有资源前都会拦截
public class filter implements Filter {
     
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
     

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
     
        System.out.println("filter被执行****");

        //放行
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {
     

    }
}

解释:

@WebFilter("/*") //访问所有资源前都会拦截

/* 是指可以拦截所有的访问资源,其中@WebFilter(" ")里面可以是任意的路径。

filterChain.doFilter(servletRequest, servletResponse);

一般Filter都是一个链,web.xml 里面配置了几个就有几个(注解配置也可以)。一个一个的连在一起

so on
request
filter1
filter2
filter3
request resource

基于XML方式


<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <filter>
        <filter-name>demo1filter-name>
        <filter-class>cn.Filter.filterfilter-class>
    filter>
    <filter-mapping>
        <filter-name>demo1filter-name>
        <url-pattern>/*url-pattern>
    filter-mapping>
web-app>

*和xml配置路由差不多,< url-pattern> < /url-pattern> 其中配置里面填写的内容为路径,/默认拦截全部路径。

过滤器执行流程

package cn.Filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

@WebFilter("/*")
public class FilterDemo1 implements Filter {
     

    public void init(FilterConfig config) throws ServletException {
     

    }
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
     

        System.out.println("filter come");
//        放行
        chain.doFilter(req, resp);
        System.out.println("filter back");
    }

    public void destroy() {
     
    }
}

当访问   http://localhost/index.jsp 资源时,首先执行的是
System.out.println(“filter come”);   然后通过过滤器(chain.doFilter(req, resp);)
然后返回过滤器执行  System.out.println(“filter back”);

过滤器生命周期

package cn.Filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

@WebFilter("/*")
public class FilterDemo2 implements Filter {
     

    public void init(FilterConfig config) throws ServletException {
     
        System.out.println("init..");

    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
     
        System.out.println("doing..");
        chain.doFilter(req, resp);
    }

    public void destroy() {
     
        System.out.println("destroy..");
    }
}

在这里插入图片描述
解释:
服务器启动就会创建Filter对象调用init方法
在这里插入图片描述
解释:
服务器关闭销毁Filter对象,服务器正常关闭就会调用destroy方法

public void doFilter()  //每次拦截时都会调用此方法
public void destroy()   //只被调用一次
public void init()      //只被调用一次

过滤器配置

拦截路径配置

1.具体资源路径: /index.jsp 只有访问index. jsp资源时,过滤器才会被执行
2.拦截目录: /user/访问/user 的所有资源时,过滤器都会被执行
3.后缀名拦截: “ * .jsp ”访问所有后缀名为jsp资源时,过滤器都会被执行
4.拦截所有资源:/
访问所有资源时,过滤器都会被执行

拦截方式配置

注解配置

设置dispatcherTypes属性

  1. REQUSET : 默认值,浏览器直接请求资源
  2. FORWORD :转发访问资源
  3. INCLUDE :包含访问资源
  4. ERROR :错误跳转资源
  5. ASYNC :异部访问过滤器Filter入门(参考传智黑马)全是干货!_第1张图片
    具体应用:
@WebFilter(value = "/*" , dispatcherTypes = DispatcherType.FORWARD)

web.xml配置

    <filter>
        <filter-name>demo1filter-name>
        <filter-class>cn.Filter.filterfilter-class>
    filter>
    <filter-mapping>
        <filter-name>demo1filter-name>
        <url-pattern>/*url-pattern>
        <dispatcher>REQUESTdispatcher>
    filter-mapping>

< dispatcher> < /dispatcher>中间的属性值也是上面注解属性中的五个属性。

过滤器链(配置多个过滤器)

执行顺序

以两个过滤器为例:过滤器1、过滤器2。

  • 过滤器1
  • 过滤器2
  • 资源
  • 过滤器2
  • 过滤器1

过滤器先后顺序

1、 注解配置
按照类名的字符串比较顺序,值小先执行
如Afilter和Bfilter先执行Afilter
2、 xml配置
< filter-mapping >谁在上面谁先执行

你可能感兴趣的:(Tomcat,过滤器,java,servlet)