版权声明:本文为博主原创文章,未经博主同意不得转载。 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须要作用的地方就好。

开启 J2EE(六)— Servlet之Filter具体解释及乱码处理实例的更多相关文章

  1. j2ee Servlet、Filter、Listener

    首先,JSP/Servlet规范中定义了Servlet.Filter.Listener这三种角色,并没有定义Interceptor这个角色,Interceptor是某些MVC框架中的角色,比如Stru ...

  2. 关于servlet的filter

    Servlet过滤器 2009-12-08 23:12:44|  分类: Java|举报|字号 订阅     一.什么是Servlet过滤器 过滤器是在数据交互之间过滤数据的中间组件,独立于任何平台或 ...

  3. java web.xml listener servlet 和filter加载顺序

    在该项目中总会遇到一些关于加载的优先问题.最近遇到了同样的类别似的,所以,如果你发现信息汇总下,以下是转载其他一些人,毕竟,人们写的不错.它不重复创建的轮.只是略作修改自己的观点. 首先能够肯定的是, ...

  4. Servlet和Filter的url匹配以及url-pattern详解 及 filter 循环问题的解决

    Servlet和filter是J2EE开发中常用的技术,使用方便,配置简单,老少皆宜.估计大多数朋友都是直接配置用,也没有关心过具体的细节,今天遇到一个问题,上网查了servlet的规范才发现,ser ...

  5. Java的Servlet、Filter、Interceptor、Listener

    写在前面: 使用Spring-Boot时,嵌入式Servlet容器可以通过扫描注解(@ServletComponentScan)的方式注册Servlet.Filter和Servlet规范的所有监听器( ...

  6. Servlet和Filter的url匹配以及url-pattern详解

    Servlet和filter是J2EE开发中常用的技术,使用方便,配置简单,老少皆宜.估计大多数朋友都是直接配置用,也没有关心过具体的细节,今天遇到一个问题,上网查了servlet的规范才发现,ser ...

  7. servlet、filter、listener继承的基类和获得作用域的方式

    一.servlet: 1.servlet属于j2ee的组件,构建servlet的web project不需要导入项目框架jar包 2.servlet的体系结构:  在j2ee API中,提供给serv ...

  8. JavaEE--JavaWeb三大组件Servlet、Filter、Listener

    Servlet.Filter.Listener是JavaEE Web服务规定的服务器动态组件,由开发者编写由Web容器创建,并保证单例以及线程安全性,其中加载顺序为Linstener -> Fl ...

  9. Servlet过滤器----Filter

    JavaEE的Servlet规范描述了三种技术:Servlet,Filter,Listener (一)过滤器简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过F ...

随机推荐

  1. [BZOJ1582] [Usaco2009 Hol]Holiday Painting 节日画画(线段树)

    传送门 线段树区间修改傻题 #include <cstdio> #include <cstring> #include <iostream> #define N 5 ...

  2. 常州模拟赛d3t1 神在夏至祭降下了神谕

    题目描述 我们村子在过去的400年中,断绝与下界的接触,过着自给自足的生活. 夏至祭是一场迎接祖灵于夏季归来,同时祈求丰收的庆典. 村里的男人会在广场上演出夏之军和冬之军的战争.夏之军会打倒冬之军的大 ...

  3. LA 并查集路径压缩

    题目大意:有n个节点,初始时每个节点的父亲节点都不存在.有两种操作 I u v:把点节点u的父亲节点设为v,距离为|u-v|除以1000的余数.输入保证执行指令前u没有父亲节点. E u:询问u到根节 ...

  4. poj 2891 模线性方程组求解

    Strange Way to Express Integers Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 8005   ...

  5. 【HDOJ5980】Find Small A(签到)

    题意:不知道 思路:队友写的 #include <stdio.h> #include <vector> #include <algorithm> #include ...

  6. nosql整理

    Nosql: Redis,Memcache,MongoDB,Hbase,Couchbase  LevelDB https://www.cnblogs.com/lina520/p/7919551.htm ...

  7. 从Activity的启动流程理解Binder

    简述 关于Activity启动流程和Binder的文章很多,大多数是分开来讲的,本文将二者结合起来,着重分析启动流程中跨进程方面的细节,其实,启动流程看似调用繁多,主要是复杂在Activity栈管理等 ...

  8. 升级python2至python3解决依赖关系

    1.最小化安装centos7,在升级python3的时候会出现很多包未安装,为解决依赖关系: yum -y install gcc gcc-c++ zlib zlib-devel libffi-dev ...

  9. mysql主从读写分离,分库分表

    1.分表 当项目上线后,数据将会几何级的增长,当数据很多的时候,读取性能将会下降,更新表数据的时候也需要更新索引,所以我们需要分表,当数据量再大的时候就需要分库了. a.水平拆分:数据分成多个表 b. ...

  10. 洛谷 P1034 矩形覆盖

    P1034 矩形覆盖 题目描述 在平面上有nn个点(n \le 50n≤50),每个点用一对整数坐标表示.例如:当 n=4n=4 时,44个点的坐标分另为:p_1p1​(1,11,1),p_2p2​( ...