文章目录
Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截,如下所示:
浏览器在访问web资源时,如果服务器配置了过滤器,则该访问在获取到web资源之间会经过过滤器,在访问完后又会回到过滤器,最后经过服务器才返回浏览器。
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.</