版权声明:本文为博主原创文章,未经博主同意不得转载。 https://blog.csdn.net/akkzhjj/article/details/36471477

定义和功能

Filter:过滤器,它能够在request到达Servlet之前预处理request,也能够在离开Servlet时处理response,通过对request或response的处理已达到过滤功能。

可是Filter仅仅是对request和response请求进行了拦截处理。通常不产生请求或者响应。

 

实现的接口

我们写Servlet须要继承一个类,Filter也一样。要实现一个接口(扩展性的体现啊):javax.servlet.Filter,并实现该接口的三个方法:

<span style="font-size:14px;">
init(FilterConfigfilterConfig)</span>

初始化方法,Servlet容器创建Servlet过滤器实例后将调用该方法。该方法将读取web.xml文件里Servlet过滤器的初始化參数。

<span style="font-size:14px;">
doFilter(ServletRequestrequest, ServletResponse response, FilterChain chain)</span>

doFilter完毕实际的过滤操作。当client请求方法与过滤器设置匹配的URL时(详见下文),Servlet容器将先调用过滤器的doFilter方法。

FilterChain用于用户訪问兴许过滤器(链结构)。

<span style="font-size:14px;">
destroy()</span>

释放Servlet过滤器占用的资源。

 

url配置

匹配Filter须要对哪些Servlet/JSP起作用,通过在web.xml配置文件里配置<url-pattern>,有例如以下方式:

1、精确匹配。对哪些Servlet起作用,不用不论什么修饰符

<span style="font-size:14px;">
<filter-mapping>  
  <filter-name>CharsetEncodingFilter</filter-name>  
  <url-pattern>/servlets/TestServlet</url-pattern>  
</filter-mapping></span>

2、扩展匹配,用*和扩展名组成

<span style="font-size:14px;">
<filter-mapping>  
  <filter-name>CharsetEncodingFilter</filter-name>  
  <url-pattern>*.jsp</url-pattern>  
</filter-mapping> </span>

3、路径匹配。包括一个文件夹和*

<span style="font-size:14px;">
<filter-mapping>  
  <filter-name>CharsetEncodingFilter</filter-name>  
  <url-pattern>/servlets/*</url-pattern>  
</filter-mapping> </span>

4、所有匹配,项目下所有的Servlet请求或对应

<span style="font-size:14px;">
<filter-mapping>  
  <filter-name>CharsetEncodingFilter</filter-name>  
  <url-pattern>/*</url-pattern>  
</filter-mapping>  </span>

详细流程

Filter是一种切入技术,而且能够在一个处理流程中切入多个Filter。通过多个Filter一层层过滤。

Filter属于声明式,也就是说仅仅要在配置文件进行须要的配置,就会产生作用,而且会依照责任链模式一样,一层层过滤下去。

实例——採用Filter设置字符集处理乱码

  Filter一个非经常常使用的功能,设置字符集,在通过request请求过程中往往那个会出现中文乱码现象,原因是Tomcat默认请求编码是ISO8859,简单的做法是这样:request.setCharacterEncoding("GB18030");可是对于大的项目。上百个上千个request,我们须要设置上百次上千次吗。肯定不会,那样改动起来无意是灾难。看我们通过Filter的实现:

  Filter实现类,继承自Filter接口:

<span style="font-size:14px;">package com.zjj.drp.util.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; /**
* 採用Filter统一处理字符集
* @author Jones
*
*/
public class CharsetEncodingFilter implements Filter {
//定义变量,用于存储从web.xml取出參数的值
private String endcoding; public void destroy() {      } public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//进入Filter
//System.out.println("CharsetEncodingFilter--->>>begin");
//设置字符集。
request.setCharacterEncoding(endcoding); //继续运行
chain.doFilter(request, response);
//离开Filter
//System.out.println("CharsetEncodingFilter--->>>end");
} public void init(FilterConfig filterConfig) throws ServletException {
//取得配置文件里參数encoding的值
this.endcoding = filterConfig.getInitParameter("encoding");
System.out.println("CharsetEncodingFilter.init()-->> endcoding=" + endcoding);
} }
</span>

配置web.xml

<pre name="code" class="html"><span style="font-size:14px;"><filter>
<filter-name>CharsetEncodingFilter</filter-name>
<filter-class>com.bjpowernode.drp.util.filter.CharsetEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</filter> <filter-mapping>
<filter-name>CharsetEncodingFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
</span>

Filter批量设置(带*的)。会影响一些效率。所以假设有效率瓶颈的Filter仅仅设置须要的即可。

总结

  还须要注意的是Filter仅仅对Post请求起作用,GET方式提交还是会出现乱码问题的。

  个人觉得Filter最好的一点是,横切性,可插拔,使得系统变得更加灵活,我们仅仅须要通过配置文件去配置这些Filter须要作用的地方就好。

最新文章

  1. vue+node开发手机端h5页面开发遇到的坑
  2. bootstrap源码分析之form、navbar
  3. angular源码分析:angular的整个加载流程
  4. android raw与assets区别
  5. hdu.1111.Secret Code(dfs + 秦九韶算法)
  6. SqlServer索引及优化详解
  7. JVM常用参数配置
  8. bzoj3983
  9. Jmeter 使用笔记之 html 报告扩展(一)
  10. struts2的json-default和struts-default的区别
  11. 安卓selector
  12. Spark SQL UDF示例
  13. Android 开发 重写定位器类Timer与TimerTask
  14. django 图书管理系统
  15. update linux dns,no need restart
  16. Sql Server Tempdb原理-日志机制解析实践
  17. easyui form load 数据表单有下拉框
  18. 8 -- 深入使用Spring -- 3...1 Resource实现类FileSystemResource
  19. C#中的垃圾回收机制与delegate
  20. 使用SolrNet访问Solr-5.5.0

热门文章

  1. Unity3D for iOS初级教程:Part 2/3
  2. ubuntu mysql安装及需要其他主机连服务器mysql时的设置(error:10061)
  3. 实验三 kali下metasploit的漏洞攻击实践
  4. spring-Ioc容器与bean
  5. 标准C程序设计七---30
  6. php生成压缩包
  7. 更改App名称
  8. Java学习:二 基础
  9. cobbler api接口开发测试实例
  10. Java 利用DFA算法 屏蔽敏感词