过滤器概述

---------------siwuxie095

  

  

  

  

  

  

  

  

过滤器是从 Servlet 2.3 规范开始新增的功能,它也是一个由 Servlet 容器管理的对象

  

  

过滤器的结构同Servlet 非常类似

 

如:也有负责初始化和清理资源的 init() 方法和 destroy() 方法

  

 

虽然二者结构类似,但功能完全不同

  

过滤器的功能可以理解为:在源数据目的数据之间起过滤作用的中间组件

  

  

  

一个简单的过滤器实例:

  

访问指定资源之前打印一条日志,访问指定资源之后再打印一条日志

  

 

点击选择工程名,右键->New->Filter,包名为:com.siwuxie095.filter,

类名为:FilterOne

  

 

  

FilterOne.java:

  

package com.siwuxie095.filter;

  

import java.io.IOException;

  

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

  

  

/**

*

*过滤器的功能:

*在元数据和目的数据之间起过滤作用的中间组件

*

*servlet被调用之前截获该调用,同时在servlet被调用之后截获该调用

*

*截获后,对请求或者响应信息进行处理

*

*如:修改实际请求中的参数信息或修改实际响应中的参数信息

*

*应用范围:如权限控制日志记录图像转换数据压缩 etc.

*

*过滤器的生命周期同servlet类似,首先初始化,然后执行doFilter方法中业务逻辑,最后销毁

*/

public class FilterOneimplements Filter {

  

 

public FilterOne() {

System.out.println("=====构造方法 =====");

}

 

 

/**

* servlet容器启动时会执行过滤器的init()方法,这一点和servlet不同

*

* servletinit()方法是在servlet第一次被访问时才会被执行

*而过滤器的init()方法在容器启动时就执行

*

* init()方法的参数是FilterConfig类型的,它用来获取过滤器初始化配置信息的接口

*

* FilterConfig是一个接口,它有一个重要方法:getInitParameter()方法

*/

publicvoid init(FilterConfig fConfig)throws ServletException {

System.out.println("=====初始化方法 =====");

//FilterConfiggetInitParameter()方法,需要传入String类型参数,

//返回值是String类型,创建以接收返回值,且返回的是以参数命名的初始化参数的值(键值对)

//若参数不存在返回空

String initParam=fConfig.getInitParameter("param");

System.out.println("param = "+initParam);

}

  

 

  

 

/**

* doFilter()方法同servletservice()方法一样,

*都用来执行具体业务逻辑,是过滤器中最重要的一个方法

*

*参数除了请求和响应的对象之外,还有一个FilterChain对象

* FilterChain也提供了一个doFilter()方法,开发人员根据业务需要决定是否调用该方法

*

*如果调用该方法,servlet容器就会将请求和响应,转发给下一个组件进行处理

*下一个组件由可能是一个过滤器,也有可能是一个servlet,或其他的web组件

*

*不调用该方法,就不会有后续的处理

*/

publicvoid doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

System.out.println("===== 开始执行doFilter方法 =====");

chain.doFilter(request, response);

System.out.println("===== 结束执行doFilter方法 =====");

}

  

 

//销毁过滤器

publicvoid destroy() {

System.out.println("=====销毁方法 =====");

}

  

}

  

  

在部署描述符web.xml 中注册 filter:

  

  

  

部署描述符web.xml 在 WEB-INF 目录下,如果没有,手动创建即可

  

点击选择工程名,右键->Java EE Tools->Generate Deployment Descriptor Stub

  

  

  

过滤器的init() 方法在 Servlet 容器被启动时就执行(即 启动 Tomcat 时

就执行,在 init() 方法前执行的是构造方法),而Servlet 的 init() 方法却

是在 Servlet 第一次被访问时才执行

  

过滤器的doFilter() 方法同 Servlet 的 service() 方法一样,都是

用来执行具体的业务逻辑,是过滤器中最重要的一个方法

  

  

过滤器在Servlet 被调用之前截获该调用,同时在 Servlet 被调用之后截获该调用

  

「即过滤器作用于Servlet 执行的前后」

  

截获后,对请求信息响应信息进行处理,如:修改实际请求中的参数信息

修改实际响应中的参数信息

  

应用范围:权限控制、日志记录、图像转换、数据压缩

  

  

过滤器的生命周期同 Servlet类似,首先初始化,

然后执行doFilter()方法中业务逻辑,最后销毁

  

  

  

  

  

  

  

  

【made by siwuxie095】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值