Head First Servlets & JSP 学习笔记 第十三章 —— 过滤器的威力

过滤器可能是最强大的Web应用开发工具了!

与Servlet非常类似,过滤器就是Java组件,请求发送到Servlet之前,可以用过滤器截获和处理请求;另外Servlet结束工作之后,但在响应发回给客户之前,可以用过滤器处理响应。

过滤器要做的事情:

请求过滤器可以:

  ①完成安全检查

  ②重新格式化请求首部或体

  ③建立请求审计或日志

响应过滤器可以:

  ①压缩响应流

  ②追加或修改响应流

  ③创建一个完全不同的响应

过滤器和Servlet相似:1.容器管理过滤器的生命周期 2.容器知道过滤器API 3.都在DD中声明

每个过滤器都必须实现Filter接口,必须实现init()方法,实现doFilter()方法,实现destroy()方法。

 1 package com.example.web;
 2 
 3 import java.io.*;
 4 import javax.servlet.*;
 5 import javax.servlet.http.HttpServletRequest;
 6 
 7 public class BeerRequestFilter implements Filter{ //实现Filter接口
 8     private FilterConfig fc;
 9     
10     public void init(FilterConfig config) throws ServletException{  //实现init()方法
11         this.fc = config;
12     }
13     
14     public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException{  //实现doFilter()方法  这里参数是常规的ServletRequest和ServletResponse
15         HttpServletRequest httpReq = (HttpServletRequest)req;
16         String name = httpReq.setRemoteUser();
17         if(null != name){
18             fc.getServletContext().log("User " + name + " is updating");
19         }
20         chain.doFilter(req, resp); //FilterChain接口的doFilter()方法,不同于Filter接口的doFilter()方法
21     }
22     
23     public void destroy(){ //实现destroy()方法,但通常这个都为空
24         
25     }
26 }

在DD中配置过滤器:

 1 <filter>
 2     <filter-name>BeerRequest</filter-name>
 3     <filter-class>com.example.web.BeerRequestFilter</filter-class>
 4     <init-param>  //可选,可以有多个<init-param>
 5         <param-name>LogFileName</param-name>
 6         <param-value>UserLog.txt</param-value>
 7     </init-param>
 8 </filter>
 9 
10 <filter-mapping> //有两种<filter-mapping>
11     <filter-name>BeerRequest</filter-name>
12     <url-pattern>*.do</url-pattern> //声明对应URL模式的过滤器映射
13 </filter-mapping>
14 
15 <filter-mapping>
16     <filter-name>BeerRequest</filter-name>
17     <servlet-name>AdviceServlet</servlet-name>  //声明对应Servlet名的过滤器映射
18 </filter-mapping>

包装器:

Servlet API中的包装器类功能极其强大。

过滤器可以在Servlet之前先行处理请求,不过在Servlet生成响应之后,过滤器想再修改响应有些麻烦。这个时候可以使用包装器。

原文地址:https://www.cnblogs.com/czp2bconfident/p/8917622.html