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

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

  1. Head First Servlets & JSP 学习笔记 第三章 —— MVC迷你教程

    临渊羡鱼,不如退而结网!是时候动手搞事情了! 我们的四大步骤: ①分析用户的视图(也就是浏览器要显示的东西),以及高层体系结构: (这个就是所谓的前端吧?用JSP?JSP可以当成Html来用吧?高层体 ...

  2. Head First Servlets & JSP 学习笔记 第十一章 —— Web应用部署

    jar:java archive(java归档) war:web archive(web归档) war文件只是Web应用结构的一个快照,采用了一种更可移植的压缩形式(它实际上就是一个jar文件).建立 ...

  3. Head First Servlets & JSP 学习笔记 第七章 —— 作为JSP

    <%@ …… %> 这是指令 <%@ page ……import="java.util.Date" %> 这是page指令,import是page指令的一个 ...

  4. Head First Servlets & JSP 学习笔记 第五章 —— 作为Web应用

    初始化参数:(init-param) 初始化参数写在web.xml文件中:(写在<servlet>标签内部) <servlet> <servlet-name>Bee ...

  5. Head First Servlets & JSP 学习笔记 第六章 —— 会话状态

    MVC中的M(模型),通常就是一个普通的类,这个类里面的信息就是业务逻辑. 会话(Session) 我们可以使用一个HttpSession对象,来保存横跨多个请求的会话状态. HTTP协议使用的是无状 ...

  6. Head First Servlets & JSP 学习笔记 第四章 —— 作为Servlet

    Servlet的任务是得到一个客户的请求,再发回一个响应. 请求: 容器控制着Servlet的一生,它会创建请求和响应对象.为Servlet创建一个新线程或分配一个线程,另外调用Servlet的ser ...

  7. [汇编学习笔记][第十三章int指令]

    第十三章int指令 13.1 int指令 格式: int n, n 为中断类型码 可以用int指令调用任何一个中断的中断处理程序(简称中断例程). 13.4 BIOS和DOS 所提供的中断例程 BIO ...

  8. Head First Servlets & JSP 学习笔记 第九章 —— 使用JSTL

    JSTL1.1 不是JSP2.0规范的一部分!你能访问Servlet和JSP API 不意味着你能访问JSTL! 使用JSTL之前,需要将两个文件("jstl.jar" 和 &qu ...

  9. Head First Servlets & JSP 学习笔记 第二章 —— Web应用体系结构

    Servlet没有main()方法,所以Servlet受其他人控制,这个其他人就是容器!而Tomcat就是一种容器. 容器向Servlet提供Http请求和Http响应:容器来调用Servlet的do ...

随机推荐

  1. 【js字符串当做数组来使用】浪费一晚【想出了3个解决方案】

    数据库的所有数据都打成字符串发到前端. 不必把它的类型也强制转成int这类的,页面负责字符串的展示 这样做可以修改页面的数据 response.setHeader("Content-type ...

  2. paramiko实现上传目录

    使用paramiko上传目录,重点是上传的那个过程,想了一上午才想出来,可能有点奇葩,但是还是实现了这个功能 #!/usr/bin/python import paramiko import os d ...

  3. laravel 路由分組

    laravel 路由分組 Route::group(['prefix' => 'admin'], function () { $namespacePrefix="\\App\\Http ...

  4. 全面理解Java内存模型(JMM)及volatile关键字

    [版权申明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/72772461 出自[zejian ...

  5. [zz] MATLAB工具箱介绍

    http://blog.sina.com.cn/s/blog_57235cc701012kfb.html Toolbox工具箱 序号 工具箱 备注   数学.统计与优化   1 Symbolic Ma ...

  6. springmvc log4j配置

    1. web.xml <!-- 加载Log4J 配置文件 --> <context-param> <param-name>log4jConfigLocation&l ...

  7. Mysql建了索引查询很慢

    遇到一个问题,有几个结构一个的查询,表的索引建的也一样,但是有的查询很快,有的却很慢,需要半分钟以上才能执行完. 查看执行计划,并没有什么区别.找了很久原因才发现是主查询和子查询所涉及的表的字符编码不 ...

  8. VMware Workstation 11 搭建windows server 2012 之sql server 2012集群常见问题整理

    1.windows server 2012内置支持iSCSI发起程序无需额外安装,iSCSI Software Target 可作为“文件和存储服务”角色下的内置功能使用 2.拷贝虚拟机的文件加入域时 ...

  9. 01-简单编写http服务器

    package com.day3; import java.io.IOException; import java.io.InputStream; import java.net.ServerSock ...

  10. 【Servlet】(1)Servlet简介、Servlet底层原理、Servlet实现方式、Servlet生命周期

    一.Servlet简介 1.Servlet定义: Servlet(Server Applet)是Java Servlet的简称,是为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交 ...