Filter详解

本文详细介绍了Servlet Filter的用途,如登录验证、日志记录等,并阐述了Filter的开发步骤,包括编写Java类和配置。同时,解释了FilterChain的工作原理及Filter的生命周期,从创建、销毁到doFilter方法的执行。此外,还讨论了FilterConfig接口在配置初始化参数中的作用,以及Filter的映射方式。
摘要由CSDN通过智能技术生成


​ Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

​ Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截,如下所示:

​ 浏览器在访问web资源时,如果服务器配置了过滤器,则该访问在获取到web资源之间会经过过滤器,在访问完后又会回到过滤器,最后经过服务器才返回浏览器。

img

1. 我们为什么要使用Filter?

​ 通常我们会使用session来保存登录用户的信息,通过从session中取出保存的属性值来判断用户是否登录, 但是如果我们有大量的请求方法,每个人方法中都这样去判断就会有很多重复代码,将来我们想改动下逻辑, 那得改动所有的请求方法实现,所以这个是不可取的。

​ 这时候就是使用Servlet Filter的时候了,它是可插拔的,对于普通的action方法来讲是透明的。 它会在执行其他方法之前或将结果返回给客户端之前来执行其他逻辑。

以下几种场景下我们会使用到Servlet Filter:

  • 将请求的参数写入日志文件
  • 对于资源的访问进行统一的授权与验证
  • 在请求到达实际Servlet之前格式化请求内容或请求头
  • 压缩返回数据后发送给客户端
  • 修改返回内容,增加一些cookie、header等信息

​ 前面提到过,Servlet是可插拔的,可以通过在web.xml中配置是否使用。如果我们定义了多个Filter,就会形成一个过滤器链。 通过实现接口javax.servlet.Filter来创建一个过过滤器。

2. Filter开发步骤

开发过滤器很简单,只需要经过编写java类,进行相关配置,就可以使用了。

2.1. 编写Java类

Servlet API中提供了一个Filter接口,我们通过实现该接口重写里面的方法就可以实现过滤器的功能。

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;


public class HelloFilter implements Filter{
   
    
    // 创建实例
    public HelloFilter(){
   
        System.out.println("1. 创建过滤器实例");
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
   
        System.</
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`filter`是一个JavaScript数组方法,它可以用于过滤数组中的元素,返回一个新的数组,其中包含符合指定条件的元素。 具体来说,`filter`方法接受一个回调函数作为参数,该回调函数会被传递每个数组元素和它们的索引,并返回一个布尔值,用于指示该元素是否应该被包含在结果数组中。如果回调函数返回`true`,该元素将被包含在结果数组中,否则将被排除。 例如,假设有一个数组`[1, 2, 3, 4, 5]`,我们可以使用`filter`方法来过滤出其中的偶数元素: ```javascript const arr = [1, 2, 3, 4, 5]; const evenArr = arr.filter(num => num % 2 === 0); // evenArr === [2, 4] ``` 在上面的例子中,回调函数判断每个元素是否为偶数,如果是,则返回`true`,否则返回`false`,最终返回一个包含偶数元素的新数组。 除了过滤出符合条件的元素,`filter`方法还可以用于删除数组中的元素,例如: ```javascript const arr = [1, 2, 3, 4, 5]; arr.filter(num => num % 2 === 0); // 返回 [2, 4] // arr === [1, 3, 5] ``` 上面的代码过滤出了数组中的偶数元素并返回一个新数组,同时原数组中的奇数元素保持不变。 除了过滤出符合条件的元素,`filter`方法还可以用于删除数组中的元素,例如: ```javascript const arr = [1, 2, 3, 4, 5]; const oddArr = arr.filter(num => num % 2 !== 0); // oddArr === [1, 3, 5] ``` 在上面的例子中,回调函数判断每个元素是否为奇数,如果是,则返回`true`,否则返回`false`,最终返回一个包含奇数元素的新数组。 总之,`filter`方法是一个非常实用的数组方法,它可以用于过滤、删除和获取数组中符合条件的元素,可以提高代码的可读性和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值