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

  • 相关阅读:
    IO复用三种方式
    sql server如何通过pivot对数据进行行列转换(进阶)
    sql server排序规则冲突问题解决
    sql server如何通过pivot对数据进行行列转换
    sql server如何通过排序控制insert into ... select ... 语句的记录插入顺序
    sql server如何用不同语种语言显示报错的错误消息
    Python编程求解第1天1分钱之后每天两倍持续一个月的等比数列问题
    sql server临时删除/禁用非聚集索引并重新创建加回/启用的简便编程方法研究对比
    sql server通过临时存储过程实现使用参数添加文件组脚本复用
    sql server重建全库索引和更新全库统计信息通用脚本
  • 原文地址:https://www.cnblogs.com/czp2bconfident/p/8917622.html
Copyright © 2011-2022 走看看