Filter是什么?

Filter不是一个Servlet,它可以叫做Servlet链,它可以用来改变一个request,修改一个response。它虽然不能产生一个response,但可以在一个request到大Servlet之前预处理request,也可以在response离开Servlet时处理response。

具体的调用关系如下图所示。

也可以说,Filter是对Request和Response请求进行了拦截。

注意:

只对post请求有效。

新建一个TestFilter类,继承Filter类后,我们可以看到主要的几个方法。

package com.bjpowermode.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; public class TestFilter implements Filter { @Override
public void destroy() {
// TODO Auto-generated method stub } @Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub } @Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub } }

1)init()

用来设置filter的配置对象,只调用一次。

2)doFilter()

是最重要最核心的方法,执行Filter的工作。每一个filter从doFilter()方法中得到当前的request及response

3)destory()

返回配置对象。

Filter的生命周期

在应用启动的时候就进行装载Filter类。容器创建好Filter对象实例后,调用init()方法。接着保存进集合容器中去了等待着,用户访问资源。当用户访问的资源正好被Filter的url-pattern拦截时,容器会取出Filter类调用doFilter方法,下次或多次访问被拦截的资源时,Web容器会直接取出指定Filter对象实例调用doFilter方法(Filter对象常驻留Web容器了)。当应用服务被停止或重新装载了,则会执行Filter的destroy方法,Filter对象销毁。

注意:init方法与destroy方法只会直接一次。

在实例中,我们用Filter主要是来设置字符集,防止jsp出现中文乱码现象。

如果不使用Filter,我们需要在每个jsp页面中添加如下语句:

<%@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>

那么,使用Filter之后呢?

package com.bjpowermode.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统一处理字符集
*/
public class CharSetEncodingFilter implements Filter { private String encoding; @Override
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain chain) throws IOException, ServletException { //System.out.println("CharsetEncoding--->>>begin");
//设置字符集
arg0.setCharacterEncoding("GB18030"); //继续执行
//如果还有filter,继续调,如果没有,就调jsp
chain.doFilter(arg0,arg1);
//System.out.println("CharsetEncoding--->>>end");
} @Override
public void init(FilterConfig arg0) throws ServletException { //System.out.println("CharsetEncoding--->>>init");
this.encoding=arg0.getInitParameter("encoding");
//System.out.println("CharsetEncoding--->>>init"+encoding);
} }

在配置文件中进行配置。

注意:

CharSetEncodingFilter方法名和与配置文件中要一致,

类的路径com.bjpowermode.drp.util.filter.CharSetEncodingFilter。

 <filter>
<filter-name>CharSetEncodingFilter</filter-name>
<filter-class>com.bjpowermode.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>

总结:

Filter提高了代码的灵活性,将变动移到了配置文件中而不是在页面上。

Filter除了可以设置字符集,解决乱码问题外,还可以用在验证用户权限,对网站进行压缩等方面。

最新文章

  1. jQuery之常用且重要方法梳理(siblings,nextAll,end,wrap,apply,call,each)-(二)
  2. *POJ 1222 高斯消元
  3. Jenkins学习四:Jenkins 邮件配置
  4. thinkphp 3.2.3+Admin LTE后台框架
  5. 使用jetty-maven-plugin插件进行测试
  6. web —— jsp笔记
  7. 实习小白笔记一(鼠标悬停、获取多选、提交修改、layer页面、单元格文字长度、json、分页、左连接)
  8. UBER司机奖励政策
  9. HDU5015 233 Matrix(矩阵高速幂)
  10. 【Java技术位】——代理模式及其事务包
  11. UNIX基础--安装应用程序: Packages 和 Ports
  12. spring3mvc与struts2比较
  13. asp.net权限认证:HTTP基本认证(http basic)
  14. PHP对象注入 PHP Object Injection
  15. 如何改变XCode的默认设置
  16. Hadoop源码篇--Reduce篇
  17. 和docket的第一次亲密接触
  18. 洛谷AT2046 Namori(思维,基环树,树形DP)
  19. php -- 魔术方法、魔术常量 简单介绍
  20. numpy中np.c_和np.r_

热门文章

  1. Bootstarp学习教程(7) 表单
  2. print_Matrix(Python实现)
  3. 2018/7/16 YMOI模拟 NOIP2013D2T3华容道
  4. 爬虫学习(十六)——jsonpath
  5. Vue项目部署遇到的问题及解决方案
  6. 项目配置中 提示access denied的问题 解决方案
  7. 【yii】【php】自定义故障代码
  8. C# 控件置于最顶层、最底层、隐藏、显示
  9. The Image Gallery Revisited
  10. ListView, GirldList 等setCurrentItem 不立即刷新