跳过正文
  1. 文章/
  2. Java/
  3. JavaEE/
  4. JavaWeb/

6、Filter

·1095 字·3 分钟· loading · loading · ·
Java JavaEE JavaWeb
GradyYoung
作者
GradyYoung
JavaWeb - 点击查看当前系列文章
§ 6、Filter 「 当前文章 」

Filter
#

  • 过滤器,是JavaWeb三大组件之一,是一个驻留在服务端的Web组件,可以截取用户端和资源之间的请求和响应信息,并对信息进行过滤
  • 过滤器可以把对web资源的请求和响应拦截下来,做一些处理后再交给下一个过滤器或客户端。从而实现一些特殊的功能。
  • 过滤器一般完成一些通用操作,比如:自动登录、权限控制、统一编码格式设置、敏感字符过滤等。

工作流程
#

image-20230529134558112

生命周期
#

  1. 当服务器启动的时候,Filter对象会被创建,并且调用init()方法
  2. 当我们通过浏览器请求Servlet的时候,Servlet对象会被创建,并且调用init()方法,然后调用过滤器的doFilter()方法对请求过滤,然后再调用servlet的service()方法,然后再调用过滤器的doFilter()方法对响应过滤
  3. 当我们多次访问Servlet的时候,只会重复的调用filter的doFilter()方法和Servlet的service()方法
  4. 当我们正常的关闭服务器的时候,会先执行Servlet的destroy()方法,然后再执行Filter的destroy()方法

过滤器的实现
#

1、实现javax.servlet.Filter接口
#

package top.ygang.filters;

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

public class MyFilter implements Filter {
  	@Override  
    public void init(FilterConfig arg0) throws ServletException {  
    	// 初始化方法,接受一个 FilterConfig 的参数,该参数是对Filter的配置,在服务器启动时自动调用
        // 一般不用实现该方法
    }  
    
    @Override  
    public void destroy() {  
    	// 服务器关闭时调用,释放Filter占用的资源
        // 一般不用实现该方法
    }  
  
    @Override  
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {
    	// 过滤方法,对 Resquest 与 Response 对象进行处理,之后交给其他Filter或服务器端
        // 如果符合过滤规则则通过chain.doFilter(request,response);进行放行
    }  
}

2、配置过滤器拦截规则
#

url-pattern的配置(配置拦截路径)
#

  • 具体的资源路径:/xxx
    • /servletDemo1,/demo1.jsp
  • 根据路径进行拦截:/xxx/*
    • /user/*,/goods/*
  • 针对后缀名进行配置:*.jsp
  • 拦截所有的配置:/*

方式一:通过web.xml文件
#

<filter>
    <!-- 配置过滤器名称,一般为Filter实现类类名 -->
    <filter-name>MyFilter</filter-name>
    <!-- 配置过滤器实现类全类名 -->
    <filter-class>top.ygang.filters.MyFilter</filter-class>
</filter>
<!-- 指定过滤器规则 -->
<filter-mapping>
    <!-- 规则所属的过滤器 -->
    <filter-name>MyFilter</filter-name>
    <!-- 过滤器拦截路径 -->
    <filter-pattern>/*</filter-pattern>
</filter-mapping>

方式二:通过注解@WebFilter
#

@WebFilter({"/login.jsp","/auth.jsp"})

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

过滤相同资源时执行的先后顺序
#

  • 配置文件:谁在配置文件的上面谁先执行
  • 注解:根据类名的字符串的字典顺序(字母a-z)进行排序由小到大

使用举例
#

过滤字符,防止中文乱码
#

如果是tomcat8之前的版本,该方法只可以解决post请求的乱码处理

@WebFilter("/*")
public class CharacterFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        request.setCharacterEncoding("utf-8");
        chain.doFilter(request,response);
    }
}
JavaWeb - 点击查看当前系列文章
§ 6、Filter 「 当前文章 」