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

一、过滤器概述

过滤器是一个程序,它先于与之相关的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方式

<?xml version="1.0" encoding="UTF-8"?>
<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>demo1</filter-name>
        <filter-class>cn.Filter.filter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>demo1</filter-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 :异部访问在这里插入图片描述
    具体应用:
@WebFilter(value = "/*" , dispatcherTypes = DispatcherType.FORWARD)
web.xml配置
    <filter>
        <filter-name>demo1</filter-name>
        <filter-class>cn.Filter.filter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>demo1</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
    </filter-mapping>

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

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

执行顺序

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

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

过滤器先后顺序

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啊~小 l i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值