13. Servlet 请求/响应过滤器

来源:互联网 发布:mac cr2转jpg 编辑:程序博客网 时间:2024/06/04 18:34
Servlet 请求/响应过滤器

1、Servlet 过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息;
可以将一个或多个 Servlet 过滤器附加到一个 Servlet (或一组 Servlet),或者 JSP 、 HTML 页面,调用 Servlet 前调用所有附加的 Servlet 过滤器。
2、Servlet 过滤器是可用于 Servlet 编程的 Java 类,可以实现以下目的:
  • 在客户端的请求访问后端资源之前,拦截这些请求。
  • 在服务器的响应发送回客户端之前,处理这些响应。

3、过滤器通过 web.xml 中的 <filter> 标签来声明,然后映射到 web.xml 中的 <servlet> 或 <servlet-mapping> ;
当 Servlet 容器启动 Web 应用程序时,会为 web.xml 声明的每一个过滤器创建一个实例;
Filter 的执行顺序与在 web.xml 配置文件中的配置顺序一致,一般把Filter配置在所有的Servlet之前

4、Servlet 过滤器的具体实现的 javax.servlet.Filter ,主要的 API 如下:
void doFilter (ServletRequest, ServletResponse, FilterChain)
完成实际的过滤操作,当客户端请求方法与过滤器设置匹配的URL时,Servlet容器将先调用过滤器的doFilter方法。FilterChain用户访问后续过滤器
void init(FilterConfig filterConfig)
web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,读取web.xml配置,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作(filter对象只会创建一次,init方法也只会执行一次)。开发人员通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。
void destroy()
Servlet容器在销毁过滤器实例前调用该方法,在该方法中释放Servlet过滤器占用的资源

5、Filter 的 init() 方法中提供了一个 FilterConfig 对象,用于获取 Filter 参数;
如 web.xml 的文件配置如下:
在 Filter 中的 init() 方法中使用 FilterConfig 对象获取参数
1
public void  init(FilterConfig config) throws ServletException {
2
    // 获取初始化参数
3
    String site = config.getInitParameter("Site"); 
4
    // 输出初始化参数
5
    System.out.println("网站名称: " + site); 
6
}

6、一个简单的 Servlet 过滤器实例
这个例子展示在 DemoServlet 接收客户端的请求之前,先由 IPFilter 过滤器处理,检测该改请求的IP如果在IP列表中(ip列表从数据库中获取的方法参数,描述在 web.xml 中),则在向请求范围写入一个标记的属性值;
demoFilter.java
web.xml
1
<?xml version="1.0" encoding="UTF-8"?>  
2
<web-app>  
3
    <filter>
4
         <filter-name>IPFilter</filter-name>
5
         <filter-class>test.LogFilter</filter-class>
6
         <init-param>
7
             <param-name>tableName</param-name>
8
             <param-value>ip_unSafe</param-value>
9
         </init-param>
10
    </filter>
11
    <filter-mapping>
12
        <filter-name>LogFilter</filter-name>
13
        <url-pattern>/demo</url-pattern>
14
    </filter-mapping>
15
    
16
    <servlet>  
17
        <servlet-name>DempServlet</servlet-name>  
18
        <servlet-class>test.DemoServlet</servlet-class>  
19
    </servlet>  
20
    <servlet-mapping>  
21
        <servlet-name>DemoServlet</servlet-name>  
22
        <url-pattern>/demo</url-pattern>  
23
    </servlet-mapping>  
24
</web-app>
以上的 <filter-mapping>中的<url-pattern> 指定 IPFilter 映射到 "/demo",如果想要将该 Filter 映射到所有 Servlet,只需修改该
<filter-mapping><url-pattern>值为 " /* ";