Filter过滤器

本文详细介绍了Java Web中的过滤器Filter的原理和使用,包括配置过滤规则、生命周期方法、过滤器链执行顺序以及解决中文乱码问题。通过具体的代码示例展示了如何实现和配置Filter,以及Filter在处理请求和响应过程中的作用。

概述

dy同名: cgblpx

过滤器实际上就是对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>cn.tedu.filterdemo.MyFilter</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配置详解

可以有4种配置方式:
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、付费专栏及课程。

余额充值