一、概述

  Servlet 过滤器是小型的 Web 组件,它们拦截请求和响应,以便查看、提取或以某种方式操作正在客户机和服务器之间交换的数据。这些组件通过一个配置文件来声明,并动态地处理,当在web.xml注册了一个Filter来对某个Servlet程序进行拦截处理时,它可以决定是否将请求继续传递给Servlet程序,以及对请求和响应消息是否进行修改。

  典型的例子包括记录关于请求和响应的数据、处理安全协议、管理会话属性,例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

  

二、Filter工作原理

  过滤器(Filter)的api包括3个接口,嵌套在javax.servlet中:Filter、FilterChain、FilterConfig。

  过滤器类实现Filter接口,然后使用这个类中的FilterChain、FilterConfig接口;FilterConfig对象将由容器提供给过滤器,以允许访问该过滤器的初始化数据;该过滤器类的一个引用将传递给FilterChain 对象,以允许过滤器把控制权传递给链中的下一个资源。

  Filter接口定义了3个方法:init()、doFilter()、destroy()

  • init() :这个方法在容器实例化过滤器时被调用,它主要设计用于使过滤器为处理做准备。该方法接受一个 FilterConfig 类型的对象作为输入。
  • doFilter() :与 servlet 拥有一个 service() 方法(这个方法又调用 doPost() 或者 doGet() )来处理请求一样,过滤器拥有单个用于处理请求和响应的方法  ―― doFilter() 。这个方法接受三个输入参数:一个 ServletRequest 、 response 和一个 FilterChain 对象。
  • destroy() :这个方法执行任何清理操作,这些操作可能需要在自动垃圾收集之前进行。

  

 package com.yx.servlet.filter;

 import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter; /**
* Servlet Filter implementation class ServletFilterTest_01
*/
@WebFilter("/ServletFilterTest_01")
public class ServletFilterTest_01 implements Filter {
private String encoding;
/**
* Default constructor.
*
*/
public ServletFilterTest_01() {
// TODO Auto-generated constructor stub
} /**
* @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
} /**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//只能解决POST请求参数乱码问题
request.setCharacterEncoding(encoding);
//指定输出编码(最后带上,后面会有说明)
response.setCharacterEncoding(encoding);
//指定输出流编码及客户端应使用的码表
response.setContentType("text/html;charset="+encoding); //把请求传回过滤链
chain.doFilter(request, response);
} /**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
//得到过滤器的初始化配置信息
encoding = fConfig.getInitParameter("encoding");
if(encoding==null){
encoding = "utf-8";
}
} }

  在web.xmlll中对过滤器进行配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<filter>
<filter-name>ServletFilterTest_01</filter-name>
<filter-class>com.yx.servlet.filter.ServletFilterTest_01</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter> <filter-mapping>
<filter-name>ServletFilterTest_01</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> </web-app>

三、过滤器链

  

  运行次序依次是:代码1,代码3,代码5,(Servelt、web资源..),代码6,代码4,代码2。

  web.xml 中的 filter-mapping 元素的顺序决定了 Web 容器应用过滤器到 Servlet 的顺序。若要反转过滤器的顺序,只需要在 web.xml 文件中反转 filter-mapping 元素即可。

  

  <filter-mapping>元素用于设置一个Filter所负责拦截的资源。一个Filter拦截的资源可以通过两种方式来指定:资源的访问请求路径和Servlet名称。

  (1)指定资源的访问路径:

    * 完全路径匹配 :以 / 开始的。如 /aa , /bb , /aa/bb...

    * 目录匹配 :以 / 开始的,以 * 结束。如 /*, /aa/* ,/aa/bb/*

    * 扩展名匹配:不能以 / 开始的。 如 *.jsp  ,*.do , *.action

  注:“/*.action” 的写法是错误的,因为它既属于路径映射,又属于扩展名映射,导致容器无法判断。

  (2)指定Servlet的名称

    <servlet-name>元素与<url-pattern>元素是二选一的关系,其值是某个Servlet在web.xml文件中的注册名称。

参考文档:

(1)http://blog.csdn.net/my98800/article/details/53940838

(2)https://www.ibm.com/developerworks/cn/java/j-pj2ee10/index.html

(3)http://www.cnblogs.com/bzx888/p/4878971.html

(4)http://www.cnblogs.com/CBDoctor/p/4235082.html

(5)http://www.runoob.com/servlet/servlet-writing-filters.html

(6)《深入体验Java Web开发内幕--高级特性》

Servlet之过滤器(Filter)的更多相关文章

  1. Servlet的过滤器Filter

    Servlet 编写过滤器 Servlet 过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息. 可以将一个或多个 Servlet 过滤器附加到一个 Servlet 或一组 Serv ...

  2. JavaWeb_初识过滤器Filter

    菜鸟教程 传送门 过滤器Filter::JavaWeb三大组件之一,它与Servlet很相似,过滤器是用来拦截请求的,而不是处理请求的 当用户请求某个Servlet时,会先执行部署在这个请求上的Fil ...

  3. Servlet过滤器Filter用法

    1 Servlet 过滤器方法 过滤器是一个实现了 javax.servlet.Filter 接口的 Java 类.javax.servlet.Filter 接口定义了三个方法:public void ...

  4. java Servlet中的过滤器Filter

    web.xml中元素执行的顺序listener->filter->struts拦截器->servlet. 1.过滤器的概念 Java中的Filter 并不是一个标准的Servlet ...

  5. Servlet基础知识(四)——Servlet过滤器Filter

    一.什么是过滤器: 政府大楼的安检保安,它既能对进入政府大楼的人员进行检查,只允许检查符合要求的进入:同时他也负责对出大楼的人进行检查,看他带出的东西是否符合要求. 同样的,Servlet中的过滤器既 ...

  6. Servlet中的过滤器Filter用法

    1.过滤器的概念 Java中的Filter 并不是一个标准的Servlet ,它不能处理用户请求,也不能对客户端生成响应. 主要用于对HttpServletRequest 进行预处理,也可以对Http ...

  7. Servlet中的过滤器Filter详解

    加载执行顺序 context-param->listener->filter->servlet web.xml中元素执行的顺序listener->filter->stru ...

  8. Servlet 过滤器Filter

    特点 1)Filter是依赖于Servlet容器,属于Servlet规范的一部分,在Servlet API中定义了三个接口类:Filter, FilterChain, FilterConfig. 2) ...

  9. Introduction of Servlet Filter(介绍javaweb组件之一过滤器filter)

    javaweb的三大组件都需要交给web服务器运行,都需要在web.xml文件中配置. ①Servlet:javax.servlet.Servlet通过http协议接受客户端的请求,并作出响应的Jav ...

随机推荐

  1. oracle锁表+解锁

    一.锁表: LOCK TABLE tablename IN EXCLUSIVE MODE; 二.解锁 * 1.首先用dba账户登录数据库 * * 2.查出被锁定的对象 * select * from ...

  2. Linux 信号signal处理函数

    转自:http://www.cnblogs.com/taobataoma/archive/2007/08/30/875662.html alarm(设置信号传送闹钟) 相关函数 signal,slee ...

  3. 【python】django上传文件

    参考:https://blog.csdn.net/zahuopuboss/article/details/54891917 参考:https://blog.csdn.net/zzg_550413470 ...

  4. 使用shell命令给文件中每一行的前面、后面添加字符

    shell command shell给一个文件中的每一行开头插入字符的方法:awk '{print "xxx"$0}' fileName shell给一个文件中的每一行结尾插入字 ...

  5. vue文件上传

    今天写一个文件上传的功能,开始想用element-ui的组件写,但是发现不知道怎么把文件标题和内容一起上传,所以用了经典的input框上传. 废话不多说,直接上代码. 这是表单: <el-for ...

  6. mybatis学习 -每天一记 mybatis insert null 报错

    mybatis 插入数据,model的属性存在null,插入报错 在使用mybatis 进行insert时,如果字段值存在null的情况,会出现插入失败的情况,解决方案: 如果使用spring boo ...

  7. win10下安装ubantu

    最近想看一点深度学习的东西,发现还是用linux更加方便一些.虽然,我对linux一窍不通....但是,目前很多教材,框架,都是基于linux.本来打算用虚拟机,后来发现虚拟机对于GPU的支持不好搞. ...

  8. springboot + schedule

    参考文章:https://blog.csdn.net/sinianliushui/article/details/78841713 参考文章: https://blog.csdn.net/hao703 ...

  9. 关于css 的兼容设置 ----笔记

    在开发网页的时候,由于浏览器的差异,会造成css 代码需要写不同的样式,才能适配大部分浏览器,这很烦,但是又不得不做,我把其中用得比较多的那些,做了一个归纳,放在这里,开发的时候,直接打开这里,复制粘 ...

  10. zabbix 本地编译安装

    转载地址 https://www.cnblogs.com/wangxiaoqiangs/p/5412147.html 简介: 单独整理一下 Zabbix Agent . 1.安装包选择 下载地址:ht ...