什么是过滤器?

过滤器:从字面上看,可以理解为将具有杂质的水过滤,留下干净的水。那么从IT的角度上理解。过滤器:是处在源数据(数据库之类的)和目标数据(显示页面)的中间组件。对于Web应用来说,过滤器是驻留在服务器上的Web组件,它可以截取客户端和资源之间的请求和响应信息,并对这些信息进行过滤。

当Web容器(服务器)接收到一个对资源数据的请求时,它会判断过滤器和这个请求是不是有关联,如果有,它将这个请求交给过滤器处理,然后在过滤器中,你可以改变请求的内容,然后再将请求给目标资源。

[请求—>过滤器—>Web容器—>目标资源]

当目标资源对请求作出响应时,Web容器同样会向转发给过滤器,在过滤器你可以对响应的内容进行改变,然后再发送给显示页面。

[目标资源—>Web容器—>过滤器—>显示页面]

过滤器的生命周期

过滤器的生命周期与web容器相同,当web容器启动时,就会读取应用的web.xml配置文件,如果这里配置了过滤器,容器就会执行实例化,并调用过滤器的init方法。

之后用户的每一次请求都会执行过滤器的doFilter方法。

  当web容器销毁时,就会执行destroy方法,释放资源。

过滤器的执行过程

用户在发送请求后,如果该请求满足过滤器的过滤规则,web容器就会执行过滤器中的doFilter方法进行特定的操作;然后通过调用FilterChain.doFilter转交给web容器。web容器执行完成后把资源返回给过滤器,再展现给用户。

简单的过滤器实例

  下面通过一个简单的代码,看看过滤器的编写。

  首先,需要创建一个过滤器,过滤器集成javax.servlet.Filter接口,其中必须实现三个方法:init() doFilter() destroy()

package com.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.http.HttpServletRequest; //定义类继承Filter,定义过滤器
public class myFilter implements Filter { public myFilter() { }
//销毁
public void destroy() { System.out.println("myFilter destroy");
} public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("myFilter start..dofilter");
//请求放行
HttpServletRequest req = (HttpServletRequest)request;
req.getRequestDispatcher("index.jsp").forward(request, response);
System.out.println("myFilter end..fofilter");
}
  //初始化
public void init(FilterConfig fConfig) throws ServletException {
System.out.println("myFilter init");
} }

 init()方法是在web容器实例化过滤器时调用的。

 doFilter()方法是每次有请求,且满足过滤规则时调用。

 destroy()方法是web容器关闭时,调用。

然后,在web.xml中配置相应的选项。如果是servlet3.0,那么支持注解的方式配置过滤器。

<filter>
<filter-name>myFilter</filter-name>
<filter-class>com.filter.myFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/index.jsp</url-pattern>
</filter-mapping>

其中几个必备的项:

  在<filter>中配置了过滤器,filter-name是过滤器的名字,filter-class是过滤器的类;

  在<filter-mapping>中配置了过滤器的映射规则,filter-name是过滤器的名字,url-pattern是过滤的路径,dispatcher是过滤器的分类(主要包括四种)

  这里先说下过滤器的规则,如果想要全部的请求都过滤,那么可以写/*

  如果想要过滤index.jsp  index.html 可以写/index*

  如果只想过滤index.jsp,可以写成/index.jsp

其次,配置好后,创建index.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
This is Filter JSP!
<%
System.out.println("index jsp");
%>
</body>
</html>

最后,当启动web容器后,可以在控制台中发现,初始化时,执行了init方法

无敌分割线-------------------------------------------------------------------------------

过滤器(filter)在web 中的应用

过滤器(Filter)在Web开发中的应用:

Filter是从Servlet2.3规范开始新增的功能,并在Servlet2.4规范中得到增强。以下是

Filter在Web开发中的应用。

过滤器概述:

过滤器就是在源数据和目的数据之间起过滤作用的中间组件。对Web应用来说,过滤器是一个驻留在服务器端的Web组件,它可以截取客户端和资源之间的请求与响应信息,并对这些信息进行过滤。

当Web容器接受到一个对资源的请求时,它将判断是否有过滤器与这个资源相关联。如果有,那么容器将把请求交给过滤器进行处理。在过滤器中,你可以改变请求的内容,或者重新设置请求的报头信息,然后再将请求发送给目标资源。当目标资源对请求作出响应时候,容器同样会将响应先转发给过滤器,再过滤器中,你可以对响应的内容进行转换,然后再将响应发送到客户端。

过滤器在Web开发中的一些主要应用:

·对用户请求进行统一认证。

·对用户的访问请求进行记录和审核。

·对用户发送的数据进行过滤或替换。

·转换图象格式。

·对响应内容进行压缩,减少传输量。

·对请求或响应进行加解密处理

·触发资源访问是事件。

·对XML的输出应用XSLT。

Filter API :

与过滤器开发相关的接口与类都包含在javax.serlvet和javax.servlet.http包中,主要有下面的接口和类。

·javax.servlet.Filter接口

·javax.servlet.FilterConfig接口

·javax.servlet.FilterChain接口

·javax.servlet.ServletRequestWrapper类

·javax.servlet.ServletResponseWrapper类

·javax.servlet.http.HttpServletRequestWrapper类

·javax.servlet.http.HttpServletResponseWrapper类

Filter接口:

开发过滤器要实现javax.servlet.Filter接口,与开发servlet要实现javax.servlet.Servlet接口类似。提供了一个公开的不带参数的构造方法。在Filter接口中,定义了下面的三个方法:

·public void init(FilterConfig filterConfig)throws ServletException

Web容器调用该方法该方法来初始化过滤器。容器在调用该方法时,向过滤器传递FIlterConfig对象,FilterConfig的用法和ServletConfig(参见以前相关内容)类似。利用FilterConfig对象可以得到ServletContext对象,以及部署描述符中配置的过滤器的初始化参数。在这个方法中,可以抛出ServletException异常,通知容器该过滤器不能正常工作。

·public void doFilter(ServletRequest request,ServletResponse

response,FilterChain chain)throws java.io.IOException,ServletException

doFilter()方法类似于Servlet接口的service()方法。当客户端请求目标资源的时候,容器就会调用与这个目标资源相关联的过滤器的doFilter()方法。在特定的操作完成后,可以调用chain.doFilter(request,response)将请求传给下一个过滤器(或目标资源),也可以直接向客户端返回响应信息,或者利用RequestDispatcher的forward()和include()方法,以及HttpServletResponse的sendRedirect()方法将请求转向到其他资源。需要注意的是,这个方法的请求和响应参数的类型是ServletRequest和ServletResponse,也就是说,过滤器的使用并不依赖于具体的协议。

·public void destroy()

Web容器调用该方法指示过滤器的生命周期结束。在这个方法中,可以释放过滤器使用的资源。与开发Servlet不同的是,Filter接口并没有相应的实现类可供继承,要开发过滤器,

只能直接实现Filter接口。

FilterConfig接口:

javax.servlet.FilterConfig接口类似于javax.servlet.ServletConfig接口,用于在过滤器初始化时,向其传递信息。FilterConfig接口有容器实现,容器将其作为参数传入过滤器对象的init()方法中。在FilterConfig接口,定义了4个方法:

·public java.lang.String getFilterName()

得到描述符中指定的过滤器的名字。

·public java.lang.String getInitParameter(java.lang.String name)

返回在部署描述中指定的名字为name的初始化参数的值。如果不存在返回null.

·public java.util.Enumeration getInitParameterNames()

返回过滤器的所有初始化参数的名字的枚举集合。

·public ServletContext getServletContext()

返回Servlet上下文对象的引用。

FilterChain接口:

FilterChain接口由容器实现,容器将其实例作为参数传入过滤器对象的doFilter()方法中。过滤器对象使用FilterChain对象调用过滤器链中的下一个过滤器,如果该过滤

器是链中最后一个过滤器,那么将调用目标资源。FilterChain接口只有一个方法,如下:

·public void doFilter(ServletRequest request,ServletResponse response)

throws java.io.IOException

调用该方法将使过滤器链中的下一个过滤器被调用。如果是最后一个过滤器,会调用目标资源。

过滤器的部署:

在实现一个过滤器后,需要在部署描述符中对过滤器进行配置,这是通过<filter>和<filter-mapping>元素来完成的。

<filter>元素用于在Web应用程序中声明一个过滤器。

在<filter>元素内,<description>、<display-name>、<icon>元素和以往servlet的配置中的相同。<filter-name>用于为过滤器指定一个名字,该元素的内容不能为空。

<filter-class>元素用于指定过滤器的完整的限定类名。<init-param>元素用于为过滤器指定初始化参数,它的子元素<param-name>指定参数的名字,<param-value>指定参

数的值。在过滤器中,可以使用FilterConfig接口对象来访问初始化参数。

下面是<filte>元素的一个小例子:

<filter>
 <filter-name>testFitler</filter-name>
 <filter-class>org.test.TestFiter</filter-class>
 <init-param>
  <param-name>word_file</param-name>
  <param-value>/WEB-INF/word.txt</param-value>
 </init-param>
</filter>

Servlet容器对部署描述符中声明的每一个过滤器,只创建一个实例。与Servlet类似,容器将在同一个过滤器实例上运行多个线程来同时为多个请求服务,因此,开发过滤器

时,也要注意线程安全的问题。

<filter-mapping>元素用于指定过滤器关联的url样式或者Servlet。

其中<filter-name>子元素的值必须是在<filter>元素中声明过的过滤器的名字。

<url-pattern>元素和<servlet-name>元素可以选择一个;

<url-pattern>元素指定过滤器关联的URL样式;

<servlet-name>元素指定过滤器对应的Servlet。

用户在访问<url-pattern>元素指定的URL上的资源或<servlet-name>元素指定的Servlet时,该过滤器才会被容器调用。

<filter-mapping>元素还可以包含0到4个<dispatcher>,指定过滤器对应的请求方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST.

·REQUEST
  当用户直接访问也面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。

·INCLUDE
  如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。

·FORWARD
  如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。

·ERROR
  如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。

例子:

<filter-mapping>
 <filter-name>testFilter</filter-name>
 <url-pattern>/test.jsp</url-pattern>
</filter-mapping>
当用户访问test.jsp页面时,容器就会调用testFilter过滤器。

<filter-mapping>
 <filter-name>testFilter</filter-name>
 <url-pattern>/index.jsp</url-pattern>
 <dispatcher>REQUEST</dispatcher>
 <dispatcher>FORWARD</dispatcher>
</filter-mapping>

当用户直接访问index.jsp页面,或者通过RequestDispatcher的forward()方法访问时,容器就会调用testFilter过滤器。

内容来源:(怕丢失,故记之,见谅)

http://www.ylzx8.cn/web/web/979338.html

http://www.cnblogs.com/xing901022/p/4482057.html

Javaweb——过滤器映射的更多相关文章

  1. 第16 天 JavaWEB过滤器和监听器技术

    Day16 JavaWEB过滤器和监听器技术 复习: 1.大结果集分页mysql的实现,是使用那个关键字,从user表中取第一页的数据,长度为10,sql语句怎么写? 2.分页查询的起始位置(star ...

  2. JAVAWEB过滤器、监听器的作用及使用>从零开始学JAVA系列

    目录 JAVAWEB过滤器.拦截器的作用及使用 过滤器Filter 什么是过滤器 为什么要使用过滤器(过滤器所能解决的问题) 配置一个过滤器完成编码的过滤 编写一个EncodingFilter(名称自 ...

  3. JavaWeb过滤器Filter(附tomcat部分源码分析)

    过滤器Filter 过滤器通常对一些web资源进行拦截,做完一些处理器再交给下一个过滤器处理,直到所有的过滤器处理器,再调用servlet实例的service方法进行处理.过滤器可以对request进 ...

  4. JavaWeb—过滤器Filter

    1.Filter简介 Filter称之为过滤器,是用来做一些拦截的任务.比如客户端请求服务器的某个资源时(可以是Servlet.JSP.HTML等等),我们可以拦截.当服务器返回资源给客户端的时候,我 ...

  5. JavaWEB过滤器和监听器技术

    过滤器介绍 什么是过滤器 生活中的例子: 滤水器,口罩,杯子上滤网,渔网 生活中的过滤器:留下我们想要的,排除,我们不想要的. 高考: 只有分数够高的同学才能进入理想的大学.有一部分同学被拦截在大学之 ...

  6. JavaWeb——过滤器及监听器

    什么是过滤器? 过滤器示意图 Filter是如何实现拦截的? Filter的生命周期 Filter的创建 Filter的销毁 FilterConfig接口 Servlet过滤器有关接口 过滤器配置 F ...

  7. struts2 javaweb 过滤器、监听器 拦截器 原理

    转: 过滤器.监听器 拦截器 过滤器 创建一个 Filter 只需两个步骤: (1)创建 Filter 处理类: (2)在 web.xml 文件中配置 Filter . 创建 Filter 必须实现 ...

  8. JavaWeb过滤器.监听器.拦截器-原理&区别-个人总结

    对比项 拦截器 过滤器 机制 反射机制 函数回调 是否依赖servlet容器 是 否 请求处理 只能对action请求起作用 几乎所有的请求起作用 对action处理 可以访问action上下文.值栈 ...

  9. JavaWeb 过滤器——验证登录 防止未登录进入界面

    昨天刚刚完成老师布置的一个Web小项目,项目中用到了两个过滤器(编码过滤.登录过滤) 比如电商网页中有些不需要登录也能访问(首页.商品详细信息...),其他都需要过滤在会话作用域(session)中是 ...

随机推荐

  1. UITest 单元测试常用的断言

    XCTFail(format…) 生成一个失败的测试: XCTFail(@"Fail"); XCTAssertNil(a1, format...) 为空判断, a1 为空时通过,反 ...

  2. PowerDesigner最基础的使用方法入门学习

    1:入门级使用PowerDesigner软件创建数据库(直接上图怎么创建,其他的概念知识可自行学习) 我的PowerDesigner版本是16.5的,如若版本不一样,请自行参考学习即可.(打开软件即是 ...

  3. [C#] Socket 通讯,一个简单的聊天窗口小程序

    Socket,这玩意,当时不会的时候,抄别人的都用不好,简单的一句话形容就是“笨死了”:也是很多人写的太复杂,不容易理解造成的.最近在搞erlang和C的通讯,也想试试erlang是不是可以和C#简单 ...

  4. Css概要与选择器,刻度单位

    目录 一.CSS3概要 1.1.特点 1.2.效果演示 1.3.帮助文档与学习 二.选择器 1.1.基础的选择器 1.2.组合选择器 1.3.属性选择器 1.4.伪类 1.5.伪元素 三.特殊性(优先 ...

  5. 让低版本的 Android 项目显示出 Material 风格的点击效果

    每天都被不同的需求纠缠的生活是幸福而又不幸的,这不我们家亲爱的设计师们又让我们在低版本的 Android 平台上实现一下类似于 Material Design 的点击效果. 虽然大家都知道 Mater ...

  6. 爆一个VS2015 Update1更新带来的编译BUG【已有解决方案】

    一个编译的BUG,在原生的VS2015中没有问题,但更新至VS2015 Update1之后就有了,大概是Update1用了新的编译器,害得我好苦.经测试,VS2013 Update5中也存在这个问题, ...

  7. 分析Mysql 5.6的Dockerfile

    Docker官方的Mysql镜像的Dockerfile托管在Github上,地址如下: https://github.com/docker-library/mysql/tree/5836bc9af9d ...

  8. 【记录】ASP.NET XSS 脚本注入攻击

    输入进行 Html 转码: HttpUtility.HtmlEncode(content); 输入保留 Html 标记,使用 AntiXSS 过滤: Install-Package AntiXSS M ...

  9. SharePoint 2013 托管导航 无法被开启的解决办法

    在阅读了园子中霖雨的一片博文<SharePoint 2013 托管导航及相关配置>之后,非常想尝试一下SharePoint 2013 中的这个新功能,但是我的网站集包括样式是从2010升级 ...

  10. Oracle并行添加主键的方法

    环境:Oracle 11.2.0.3 需求:生产一张表由于前期设计不当,没有主键.现需要添加主键,数据量很大,想并行建立.   1.直接添加,提示ora-3001:未实施的功能;只能单线程建立主键 S ...