从开发人员的角度看,过滤器是一个 Java 类,它实施 中所定义的接口。关键方法是
doFilter
,它具有以下特征码:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
下面的图表展示了三个场景中的请求/响应流程:具有一个客户端 (C) 和一个 servlet (S) 但没有过滤器的应用程序,使用一个过滤器 (F) 的同一个应用程序,以及在一个过滤器链中使用两个过滤器(F1 和 F2)的同一个程序。注意,虽然过滤器可以修改请求或响应对象,但是它并不一定要执行该操作。过滤器可以传递对象,而同时保持它未被修改。并且,您在后端无需 servlet 即可使用过滤器 — 您可以通过配置应用程序服务器(或其它容器)将过滤器应用于任何请求。
无过滤器 | 一个过滤器 | 两个过滤器链 |
---|---|---|
除了实施过滤器外,您必须编辑 Web 应用程序部署描述符文件 (
web.xml
),容器才能找到并调用该过滤器。我们的WEB容器需要看web.xml才能找到相关的过滤器出来!
FilterAllRequests
mypackage1.FilterOne
FilterAllRequests
/*
跟传统的servlets是一样的配置。指定具体的实施过滤器的类及其映射URL
这里是定义另一个过滤器的 XML 代码。由于在
元素中指定了值,此容器只有在接收到对 /mydocs
目录中的资源的请求时才会应用该过滤器。
其中的
若要定义一个过滤器链,请在配置文件中放置两个或更多个过滤器声明,并为
元素提供合适的值。例如,如以下代码所示,当容器接收到类似于 等资源的请求时,它将应用
FilterAllRequests
和 FilterMyDocs
。如果两个或更多个过滤器应用到同一个资源,则按照它们在配置文件中显示的先后次序调用它们。
...
FilterAllRequests
mypackage1.FilterOne
FilterAllRequests
/*
FilterMyDocs
mypackage1.FilterTwo
FilterMyDocs
/mydocs/*
像这样的话会有两个过滤器处理的!
/* 表示的是全部的URL的。肯定要用到了
...
现在来看几个实例整理一下:
过滤器说白了比如说验证用户是否登录。在ASP中得一个一个页面去验证麻烦。
如果很多页面,这样一个个去判断是很繁琐的一件事啊,想请教下能否向JAVA中实现那样,写个专门的类,然后再在配制文件中进行配制就可以了,在整个程序中都有效啦