关于Filter过滤器

Filter过滤器的作用

Servlet2.3以及之后的版本所提供的过滤请求与响应的对象

既能对客户端向服务器发送的请求进行过滤,也能对服务器向客户端产生的响应进行过滤

 

 

 Filter对象的创建

  创建一个Class实现Filter接口,并实现接口中三个抽象方法。

init()方法:

  • 初始化方法,在创建Filter后立即调用。可用于完成初始化动作。

doFilter()方法:

  • 过滤请求与相响应的方法,当客户端浏览器请求的URL与Filter所定义URL-Pattern所匹配,那么该请求会进到该过滤器执行相应操作,可用于对请求和响应实现预处理。

destroy()方法:

  • 销毁方法,在销毁Filter之前会调用一次该方法,可用于完成资源释放等动作。

在Filter中设置请求编码

 

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //在过滤前设置请求编码
        servletRequest.setCharacterEncoding("utf-8");
        filterChain.doFilter(servletRequest,servletResponse);
        //响应的结果根据业务的需求来决定,不建议设置响应编码
        servletResponse.setCharacterEncoding("utf-8");
    }

 

FilterConfig对象的使用

用来读取<filter>中<init-param>初始化参数的对象,该对象通过参数传递到init方法中,用于读取初始化参数

  • filterConfig.getInitParameter("name")

    通过name获取对应的value。

  • filterConfig.getInitParameterNames()

    返回该Filter中所有中的值。

复制代码
    <filter>
        <filter-name>encodingfilter</filter-name>
        <filter-class>www.filter.encodingFilter</filter-class>
        <init-param>
            <param-name>code</param-name>
            <param-value>gbk</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingfilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
复制代码
复制代码
import javax.servlet.*;
import java.io.IOException;

/**
 * 设置请求编码
 */
public class encodingFilter implements Filter {

    private String defaultcode="utf-8";

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        //获取initparam参数
        String code=filterConfig.getInitParameter("code");
        if (code!=null&&code.length()>0){
            this.defaultcode=code;
        }


    }

    @Override
    public void destroy() {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //在过滤前设置请求编码
        servletRequest.setCharacterEncoding(this.defaultcode);
        filterChain.doFilter(servletRequest,servletResponse);
        //响应的结果根据业务的需求来决定,不建议设置响应编码
        servletResponse.setCharacterEncoding("utf-8");
    }
}
复制代码

FilterChain过滤器链

技术特点

在对请求与响应做预处理时,可以实现“插拔式”程序设计-------根据需求,通过web.xml添加或去掉多个Filter;

当有多个过滤器对某个请求及响应进行过滤时,称这组过滤器为过滤器链

执行顺序

按照web.xml文件中配置的上下顺序来决定先后执行,在上面的先执行,在下面的后执行

 

 

 web.xml

复制代码
    <filter>
        <filter-name>filter1</filter-name>
        <filter-class>www.filter.firstfilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>filter1</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <filter>
        <filter-name>encodingfilter</filter-name>
        <filter-class>www.filter.encodingFilter</filter-class>
        <init-param>
            <param-name>code</param-name>
            <param-value>gbk</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingfilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
复制代码
firstfilter.java
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("请求被过滤1!");
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("响应被过滤1");
    }
encodingfilter.java
复制代码
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //在过滤前设置请求编码
        servletRequest.setCharacterEncoding(this.defaultcode);
        System.out.println("请求被过滤2");
        filterChain.doFilter(servletRequest,servletResponse);
        //响应的结果根据业务的需求来决定,不建议设置响应编码
        servletResponse.setCharacterEncoding("utf-8");
        System.out.println("响应被过滤2");
    }
复制代码

基于@WebFilter注解式开发Filter

  •   通过@WebFilter注解替代web.xml中Filter 的配置。
  •   使用注解式开发Filter时,执行顺序会根据Filter的名称进行排序的结果决定调用的顺序。

Filter的生命周期

  Filter的生命周期由容器管理。

   初始化当容器启动时会实例化Filter并调用init方法完成初始化

   服务:当客户端浏览器发送请求时,容器会启动一个新的线程来处理请求,如果请求的URL能够被过滤器所匹配,那么先调用过滤器中的doFilter(在处理请求的线程中)方法,再根据是否有chain.doFilter的指令,决定是否继续请求目标资源。

  销毁:当容器关闭时 会销毁Filter对象,在销毁之前会调用destroy方法。

 

posted @   chaplu  阅读(40)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示