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

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

过滤器要做的事情:

请求过滤器可以:

  ①完成安全检查

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

  ③建立请求审计或日志

响应过滤器可以:

  ①压缩响应流

  ②追加或修改响应流

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

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

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

 package com.example.web;

 import java.io.*;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest; public class BeerRequestFilter implements Filter{ //实现Filter接口
private FilterConfig fc; public void init(FilterConfig config) throws ServletException{  //实现init()方法
this.fc = config;
} public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException{  //实现doFilter()方法  这里参数是常规的ServletRequest和ServletResponse
HttpServletRequest httpReq = (HttpServletRequest)req;
String name = httpReq.setRemoteUser();
if(null != name){
fc.getServletContext().log("User " + name + " is updating");
}
chain.doFilter(req, resp); //FilterChain接口的doFilter()方法,不同于Filter接口的doFilter()方法
} public void destroy(){ //实现destroy()方法,但通常这个都为空 }
}

在DD中配置过滤器:

 <filter>
<filter-name>BeerRequest</filter-name>
<filter-class>com.example.web.BeerRequestFilter</filter-class>
<init-param>  //可选,可以有多个<init-param>
<param-name>LogFileName</param-name>
<param-value>UserLog.txt</param-value>
</init-param>
</filter> <filter-mapping> //有两种<filter-mapping>
<filter-name>BeerRequest</filter-name>
<url-pattern>*.do</url-pattern> //声明对应URL模式的过滤器映射
</filter-mapping> <filter-mapping>
<filter-name>BeerRequest</filter-name>
<servlet-name>AdviceServlet</servlet-name>  //声明对应Servlet名的过滤器映射
</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. Fabric的@runs_once的理解

    1:runs_once的用法,一直没理解,我看网上都是说:“函数修饰符,标识的函数只会执行一次,不受多台主机影响”     实在没理解,然后看了一下官方文档,这样解释     举个例子: #!/usr ...

  2. android 监控应用进程

    在android系统中,怎么监控应用的进程改变及消亡呢? 至于监控应用进程能做什么,这个就不多说了,你懂的. 在android系统中有这么一个类ActivityManagerNative,看名称就大概 ...

  3. 【C++】vector用法详解

    转自:https://blog.csdn.net/fanyun_01/article/details/56842637#commentBox 一.简介 C++ vector类为内置数组提供了一种替代表 ...

  4. read()、write()返回 Input/output error, Device or resource busy解决

    遇到的问题,通过I2C总线读.写(read.write)fs8816加密芯片,报错如下: read str failed,error= Input/output error! write str fa ...

  5. sxstrace启动.bat

    @echo offset dd=%date:~8,2%set mm=%date:~5,2%set yy=%date:~0,4%set Tss=%TIME:~6,2%set Tmm=%TIME:~3,2 ...

  6. finstrument-functions

    2017-12-03 23:59:16 参考 如何快速地在每个函数入口处加入相同的语句? https://www.zhihu.com/question/56132218 做个存档 scj@scjCom ...

  7. PowerDesiger 生成C#实体类,字段转变成大小写方法

    1.打开编辑生成C#实体类的PD脚本 2..L:  表示全部转小写,.U: 表示全部转成大写.

  8. js类的继承,es5和es6的方法

    存在的差异:1. 私有数据继承差异 es5:执行父级构造函数并且将this指向子级 es6:在构造函数内部执行super方法,系统会自动执行父级,并将this指向子级2. 共有数据(原型链方法)继承的 ...

  9. Python与设计模式之创建型模式及实战

    用Python学习一下设计模式,如果很枯燥的话,就强行能使用的就用一下.设计模式参考Python与设计模式-途索 1. 单例模式 保证一个类仅有一个实例,并提供一个访问它的全局访问点. import ...

  10. crontab自动失效注意事项

    若用户密码过期,用户的crontab计划任务会自动失效.重设用户密码修改时间后,crontab会自动恢复. #使用chage -l 查看用户密码过期时间 chage -l user #使用chage ...