• 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生成响应之后,过滤器想再修改响应有些麻烦。这个时候可以使用包装器。

  • 相关阅读:
    杭电1171 Big Event in HDU(母函数+多重背包解法)
    怎样设计接口?
    未将对象引用设置到对象的实例--可能出现的问题总结
    開始Unity3D的学习之旅
    介绍一款轻量级js控件:easy.js
    Mustache 使用心得总结
    (ArcGIS API For Silverlight )QueryTask 跨层查询,和监控完整的查询!
    非常基本的SQL 内外连接
    Myeclipse它显示了一个目录的结构,而不是包
    Duanxx的Design abroad: C++矩阵运算库Eigen 概要
  • 原文地址:https://www.cnblogs.com/czp2bconfident/p/8917622.html
Copyright © 2020-2023  润新知