Filter过滤器

概述

过滤器实际上就是对web资源进行拦截,做一些处理后再交给下一个过滤器或servlet处理

通常都是用来拦截request进行处理的,也可以对返回的response进行拦截处理。

通常用来做一些通用配置,比如:权限验证,登录验证,乱码处理等。

 入门案例

实现Filter接口,重写一些方法,配置过滤规则。

测试

package cn.tedu.filterdemo;

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

@WebFilter("/*")//拦截所有请求,只要访问这个项目里的资源,全都拦截,不放行就阻塞
public class MyFilter implements Filter {
    public void destroy() {
    }
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        System.out.println("filter上线...");
        chain.doFilter(req, resp);//放行,否则就阻塞住了
    }
    public void init(FilterConfig config) throws ServletException {

    }

}

在web.xml里配置过滤器信息

配置过滤器的过滤规则,可以使用注指定,也可以在web。xml里配置,二选一即可

web.xml内容

<filter>

<filter-name>MyFilter</Filter-name>

<filter-class></filter-class>

</filter>

<filter-mapping>

<filter-name>MyFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

Filter生命周期

FIlter的生命周期中,包含着几个方法,不同阶段服务器会调用不同的方法,包括init() destory()doFilter()

package cn.tedu.filterdemo;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter("/*")
public class Filter3 implements Filter {
   //在服务器启动时,就会自动创建Filter对象,并执行init,通常用来完成项目的初始化,而且只执行1次
    public void init(FilterConfig config) throws ServletException {
        System.out.println("filter init...");
    }
    //每次拦截到请求后,都会执行的一些业务逻辑.会执行多次
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        System.out.println("filter doFilter...");
        chain.doFilter(req, resp);
    }
    //服务器正常关闭时会执行,而且只执行1次
    public void destroy() {
        System.out.println("filter destroy...");
    }
}

Filter配置详解

可以有四种配置方式:
1.具体文件:index。jsp,是指只有访问index。jsp这一个资源时,过滤器会被执行

2.匹配前缀:/user/*,是指访问user下的所有资源时,过滤器会被执行。

3.匹配后缀:*。jsp,是指访问所有后缀名为jsp的文件时,过滤器会被执行。

4.匹配所有:/*,是指访问所有资源时,过滤器会被执行。

测试

package cn.tedu.filterdemo;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
//@WebFilter("/hello1.html") //只拦截固定资源
//@WebFilter("/user/*") //按照请求前缀拦截
//@WebFilter("*.jsp") //按照请求后缀拦截
@WebFilter("/*") //啥都拦截
public class Filter4 implements Filter {
    public void destroy() {
    }
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        System.out.println("filter doFilter....");
        chain.doFilter(req, resp);
    }

    public void init(FilterConfig config) throws ServletException {

    }

}

FilterChain过滤器链

执行顺序:

有多个过滤器配置时,依次按照:

过滤器1

过滤器2

执行资源

过滤器2

过滤器1

 过滤器的先后顺序

注解配置:哪个过滤器将会先被执行,会按照类名的字符串比较规则。较小的先执行。如:AFilter

先于BFilter执行,Filter3先于Filter4执行。

web.xml配置:依次按照的顺序执行,谁在上面就先执行谁。

扩展:过滤器的执行

解决中文乱码

过滤器通常可以用来做一些通用配置,比如:防止请求或者响应时的中文乱码现象,添加权限的判断等。

package cn.tedu.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter("/user/*")
public class Filter1 implements Filter {
    public void destroy() {
        System.out.println("destroyFilter");
    }
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        System.out.println("filter1...doFilter");
        req.setAttribute("name","jack");
        req.setCharacterEncoding("utf-8");//解决请求时的中文乱码
        resp.setContentType("text/html;charset=utf8");//解决响应时的中文乱码
        chain.doFilter(req, resp);//放行请求,可以继续访问目标资源.否则就会拦截请求
    }
    public void init(FilterConfig config) throws ServletException {
        System.out.println("initFilter");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值