Filter学习笔记

博主声明:
本文由博主luoru_LR原创,请多支持与指教。
转载请在开头附加本文链接及作者信息,并标记为转载。
博主主页

过滤器简介

过滤器(Filter)也被称为拦截器,是Servlet中非常实用的技术,Web开发人员通过Filter技术,可以在用户访问某个Web资源(如JSP、Servlet、HTML、图片和CSS等)之前,对访问的请求和响应进行拦截,从而实现一些特殊的功能。例如:验证用户访问权限、记录用户操作、对请求进行重新编码和压缩响应信息等。
过滤器的运行原理是:当用户的请求到达所请求的资源之前,可以借助过滤器来改变这些请求的内容,此过程也称为“预处理”;当执行结果要响应到用户之前,可经过过滤器修改响应输出的内容,此过程也称为“后处理”。一个过滤器运行过程可以分解为一下几个步骤:

  1. Web容器判断接收的请求资源是否有与之匹配的过滤器,如果有,容器将请求交给相应过滤器处理;
  2. 在处理器预处理过程中,可以改变请求的内容,或者重新设置请求的报头信息,然后根据业务需求对请求进行拦截返回或者将请求发给目标资源;
  3. 如请求被转发给目标资源,则由目标资源对请求进行处理后做出响应;
  4. 容器将响应转发回过滤器;
  5. 在过滤器后处理过程中,可以根据需求对响应的内容进行修改;
  6. Web容器将响应发送回客户端;

过滤器的核心接口

过滤器的实现主要依靠以下核心接口:

  • javax.servlet.Filter接口
  • javax.servlet.FilterConfig接口
  • javax.servlet.FilterChain接口

Filter接口
开发Filter必须实现javax.servlet.Filter接口,并提供一个公共的不带参数的构造方法。其中Filter接口定义了3个方法:

方法说明
init(FilterConfig config)过滤器初始化方法。容器在过滤器实例化或调用此方法对过滤器进行初始化,同时向其传递FilterConfig对象,用于获得和Servlet相关的ServletContext对象。
doFilter(ServletResquest request,ServletResponse response,FilterChain chain)过滤器的功能实现方法。当用户请求经过时,容器调用此方法对请求和响应进行功能处理。该方法由容器传入3个阐述对象,分别用于获取请求对象、响应对象和FilterChain对象,请求和响应对象分别为S而vletRequest和ServletResponse,并不依赖于具体的协议,FilterChain对象的doFIlter(request,reponse)方法负责将请求传递给下一个过滤器或目标资源。
destroy()该方法在过滤器生命周期结束前由Web应用调用,可用于使用资源的释放

FilterConfig接口
FilterConfig接口由容器实现,容器将其实例作为参数传入过滤器(Filter)对象的初始化方法中init()中,来获取过滤器的初始化参数和Servlet的相关信息。FilterConfig接口的具体方法如下:

方法说明
getFilterName()获取配置信息中指定的过滤器的名称
getinitParameter(String name)获取配置信息中指定的名为name的过滤器初始化参数值
getInitParameterNames()获取过滤器的所有初始化参数的名字的枚举集合
getServletContext()获取Servlet上下文对象

FilterChain接口

FilterChain接口由容器实现,容器将其实例作为参数传入过滤器对象的doFilter()方法中。过滤器对象使用FilterChain对象调用过滤器链中的下一个过滤器,如果该过滤器是链中最后的一个过滤器,那么将调用目标资源。
FilterChain接口只有一个方法,如下:

方法说明
doFilter(ServletRequest request,ServletResponse response)该方法将使过滤器链中的下一个过滤器被调用,如果该过滤器是链中最后的一个过滤器,那么将调用目标资源。

过滤器开发

基于上述过滤器的核心接口,一个过滤器的开发可以经过一下三个步骤:

  1. 创建Filter接口实现类
  2. 编写过滤器的功能实现代码
  3. 对过滤器进行声明和配置

Filter基本代码结构:

package com.luoru.Filter;

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

//此配置表示在浏览器请求FilterDemo01.jsp时使用此过滤器进行过滤拦截
@WebFilter("/FilterDemo01.jsp")
public class FilterDemo01 implements Filter {

    /**
     * 空的构造器方法(可不写)
     */
    public FilterDemo01(){
    }

    /**
     * 过滤器初始化方法
     */
    @Override
    public void init(FilterConfig filterConfig){
        System.out.println("执行init()方法!");
    }

    /**
     * 过滤器执行过滤功能的方法
     */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

        System.out.println("执行doFilter方法----请求资源");
        //使过滤器进行下一目标资源的调用,可理解为“放行”
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("执行doFilter方法----响应资源");
    }

    /**
     * 过滤器生命周期结束前执行的资源释放方法
     */
    @Override
    public void destroy() {
        System.out.println("执行destroy()方法!");
    }
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值