Java Web进阶——Filter过滤器
一、过滤器的介绍:
- 在Servlet规范2.3中定义了过滤器,它是一个服务器端的组件,可以截取用户端的请求与响应信息,并且对这些信息进行过滤。
- Servlet过滤器本身并不生成请求和响应对象,只是提供过滤功能。
- Servlet过滤器能够在Servlet被调用之前检查Request对象,并修改Request Header和Request内容。
- Servlet过滤器可以过滤的Web组件包括Servlet,JSP和HTML等文件。
本文源码——GitHub:
https://github.com/imperio-wxm/wordpressCode/tree/master/Filter
二、过滤器在实际开发中的应用场景
三、过滤器的工作原理
【没有过滤器】:
用户直接访问WEB资源。
【有过滤器】:
WEB容器启动时进行过滤器的加载,用户发出请求到过滤器,过滤器判断请求是否符合规则,符合规则的请求通过过滤器发送给WEB资源,WEB资源响应的信息返回给过滤器,过滤器再将WEB资源的响应返回给用户。
四、过滤器的生命周期(类似Servlet的生命周期)
1.实例化——通过web.xml进行配置加载,在容器启动时只会实例化一次
2.初始化——调用init()方法,加载信息只会执行一次
3.过滤——使用doFilter()方法进行多次过滤
4.销毁——WEB容器关闭时调用destroy()方法进行销毁
所有的Servlet过滤器都必须实现javax.servlet.Filter接口,并实现该接口中的三个方法。
- 这是过滤器的初始化方法,web容器创建过滤器实例后将调用这个方法。这个方法中可以web.xml文件中过滤器的参数。
- 这个方法完成实际的过滤操作。这个地方是过滤器的核心方法,当用户请求访问与过滤器关联的URL时,web容器将先调用过滤器的doFilter方法。
- FilterChain方法参数可以调用chain.doFilter方法,将请求传给下一个过滤器(或目标资源),或利用转发、重定向请求转发到其他资源。
- web容器在销毁过滤器实例前调用该方法,在这个方法中可以释放过滤器占用的资源。
【生命周期代码演示】

package com.filter; import javax.servlet.*;
import java.io.IOException; /**
* Created by wxm-Imperio
*/
public class FirstFilter implements Filter {
@Override
public void destroy() {
System.out.println("destroy,firstFilter");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
System.out.println("start,doFilter,firstFilter");
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("End,doFilter,firstFilter");
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("init。firstFilter");
}
}

【web.xml配置】

<filter>
<filter-name>Filter的名字</filter-name>
<filter-class>Filter类的名字</filter-class>
<init-param>
<description>描述信息可以省略或者放在此处</description>
<param-name>参数名称</param-name>
<param-value>参数的值</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Filter的名字</filter-name>
<url-pattern>URL</url-pattern>
<dispatcher></dispatcher>//过滤器类型
</filter-mapping>

注意:一般Filter配置在所有的Servlet之前。
五、支持多个过滤器
- 每个过滤器有不同的URL地址
- 当不同的过滤器URL地址相同时,会生成过滤器链:
- 用户请求——依次每个过滤器——web资源(顺序是:服务器按照web.xml中过滤器定义的先后顺序组成一条链)
【过滤器链的web.xml配置】

<!--过滤器1的配置信息--!>
<filter>
<filter-name>Filter1的名字</filter-name>
<filter-class>Filter1类的名字</filter-class>
<init-param>
<description>描述信息可以省略或者放在此处</description>
<param-name>参数名称</param-name>
<param-value>参数的值</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Filter1的名字</filter-name>
<url-pattern>URL</url-pattern>
<dispatcher></dispatcher>//过滤器类型
</filter-mapping> <!--过滤器2的配置信息--!>
<filter>
<filter-name>Filter2的名字</filter-name>
<filter-class>Filter2类的名字</filter-class>
<init-param>
<description>描述信息可以省略或者放在此处</description>
<param-name>参数名称</param-name>
<param-value>参数的值</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Filter2的名字</filter-name>
<url-pattern>URL</url-pattern>
<dispatcher></dispatcher>//过滤器类型
</filter-mapping>

注意:过滤器的执行顺序就是在web.xml里配置的顺序。
六、过滤器的分类
Servlet2.5:
@WebFilter(servletNames = {"SimpleServlet"} filterName = "SimpleFilter")
public class LessThanSixFilter implements Filter {
//类中内容
}
【ERROR的配置信息】

<error-page>
<error-code>404</error-code>
<location>/error.jsp</location>
</error-page> <filter>
<filter-name>errorFilter</filter-name>
<filter-class>com.filter.ErrorFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>errorFilter</filter-name>
<url-pattern>/error.jsp</url-pattern>
</filter-mapping>

【ErrorFilter过滤器代码】

public class ErrorFilter implements Filter {
@Override
public void destroy() {
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
System.out.println("检测到有错误信息");
}
}

Servlet3.0:
- @WebFilter(引言)用于将一个声明为过滤器,该注解将会在部署时被容器处理,容器将根据具体的属性配置相应的类部署为过滤器
【异步操作处理代码:过滤器不等待线程,直接执行后面内容,实现异步处理】
AsynServlet

//设置Servlet支持异步
@WebServlet(name = "AsynServlet", asyncSupported = true)
public class AsynServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("Servlet执行开始时间" + new Date());
//实现异步操作
AsyncContext context = request.startAsync();
//开启异步线程
new Thread(new Executor(context)).start();
System.out.println("Servlet执行结束时间" + new Date());
} protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
} //内部类模拟线程
public class Executor implements Runnable { private AsyncContext context;
//实现构造方法
public Executor(AsyncContext context) {
this.context = context;
} @Override
public void run() {
//执行相关的复杂业务
try {
Thread.sleep(1000 * 10); //context.getRequest();
//context.getResponse(); System.out.println("业务执行完成时间" + new Date());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

AsvnFilter过滤器

//注解
@WebFilter(filterName =
"AsynFilter", value = {"/AsynServlet"}, asyncSupported = true, dispatcherTypes = {DispatcherType.REQUEST,DispatcherType.ASYNC}) public class AsynFilter implements Filter {
@Override
public void destroy() {
} @Override
public void init(FilterConfig filterConfig) throws ServletException {
} @Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
System.out.println("Start..........AsynFilter");
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("End..........AsynFilter");
}
}

web.xml配置

<servlet>
<servlet-name>AsynServlet</servlet-name>
<servlet-class>com.servlet.AsynServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AsynServlet</servlet-name>
<url-pattern>/AsynServlet</url-pattern>
</servlet-mapping>

七、FilterConfig的使用
Filter的init方法中提供了一个FilterConfig对象,提供相关的操作:
如获取Filter中配置的初始化参数web.xml配置:

<filter>
<filter-name>LoginFilter</filter-name>
<filter-class>com.itzhai.login.LoginFilter</filter-class>
<init-param>
<param-name>username</param-name>
<param-value>arthinking</param-value>
</init-param>
</filter>

在init()方法中获取:
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//获取Filter初始化参数
String username = filterConfig.getInitParameter("username");
}
在Filter中访问application:
ServletContext context = filterConfig.getServletContext();
也可以在doFilter方法中根据转换好的request获取:
HttpServletRequest req = (HttpServletRequest)request;
ServletContext context = req.getSession().getServletContext();
八、项目实例
慕课网中用户登录的加强版Demo,利用过滤器对用于请求和服务器回应进行过滤。
Java Web进阶——Filter过滤器的更多相关文章
- java web之Filter详解
java web之Filter详解 2012-10-20 0 个评论 作者:chenshufei2 收藏 我要投稿 .概念: Filter也称之为过滤器,它是Servlet技术中比较激动人心的技术,W ...
- JAVA WEB 三器之过滤器(Filter)
过滤器(Filter) 1. 简介 过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息,它是 Servlet 技术中最实用的技术,属于系统级别,主要是利用函数的回调实现.对 Jsp, ...
- [Java] JSP笔记 - Filter 过滤器
一.什么是Web过滤器 Servlet API 很久以前就已成为企业应用开发的基石,而 Servlet 过滤器则是对 J2EE 家族的相对较新的补充. Servlet 过滤器是可插入的 Web 组件, ...
- Java 中的 Filter 过滤器详解
Filter简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件 ...
- Java Web之Filter
Filter被称为过滤器或者拦截器,基本功能就是对调用servler过程的拦截,在servlet进行响应和处理前后实现一些特殊功能.其实,Filter过滤器就是一个实现了javax.servlet.F ...
- Java中的Filter过滤器
Filter简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件 ...
- java web中filter分析
摘自博客园,博主孤傲苍狼 一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp ...
- Java web学习filter (1)
一.概念:Filter也称之为过滤器,它是Servlet技术中比较激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源: 例如Jsp, Servlet, 静态图片文件 ...
- java Web三大组件--过滤器
参考博客:http://www.cnblogs.com/coderland/p/5902878.html https://www.cnblogs.com/HigginCui/p/5772514.htm ...
随机推荐
- ubuntu安装android开发环境
1.安装oracle-jdk 打开终端,使用下面的命令: java -version 如果你看到像下面的输出,这就意味着你并没有安装过Java: The program ‘java’ can be f ...
- C++公有派生
C++中的公有派生: 1.格式:Class A:public B{...}: 例如我们先声明了一个基类:SafeIntArray,当我们要声明它的派生类IndexIntArray时,格式如下:
- OpenCV摄像头人脸识别
注: 从外设摄像装置中获取图像帧,把每帧的图片与人脸特征进行匹配,用方框框住识别出来的人脸 需要用到的函数: CvHaarClassifierCascade* cvLoadHaarClassifier ...
- git 教程(7)--撤销修改
自然,你是不会犯错的.不过现在是凌晨两点,你正在赶一份工作报告,你在readme.txt中添加了一行:
- JQ库函数记忆要点
1.核心(1.核心函数2.对象访问3.数据缓存4.队列控制4.插件机制5.多库共存) 2.属性(1.属性2.css类3.HTML代码/文本/值) 3.选择器(表单,表单对象属性,基本,内容,子元素,层 ...
- IE盒模型
IE5.5及更早的版本使用的是IE盒模型,在在IE6及以上版本的浏览器中,浏览器支持一种解决了这种差异的可选的渲染模式,也开始遵循标准模式. IE盒模型和W3C盒模型的差异: IE盒模型,块元素的实际 ...
- u-boot 2011.09 调用kernel 的流程
这段时候我总是觉得有个问题,u-boot 的存在是不是就是为了调用kernel 而存在的. 所以,粗浅的跟了一下这个流程,还有很多细节上的东西没有做好,往指正. u-boot-2011.9 调用内核代 ...
- PyQt4多线程定时刷新控件
1.通过事件关联和线程关联的方法刷新控件 self.listview=updatelistview()self.listview.updateText.connect(self.viewlist) ...
- tornado RequestHandler request.body & request.arguments
request.body , 请求的原始内容,post方式放在body中的. request.arguments, body参数和url参数的统一体, 同时也是经过“加工”,解码的. eg.在对接其他 ...
- Vim保存只读模式下的修改
用 vim 打开没有写权限的文件而忘记用 sudo 时,文件变成 read-only这时候用 :w!, SHIFT+ZZ,或者 qw! 都无法保存 :w !sudo tee % :w : Write ...