java web 映射_Javaweb——过滤器映射

什么是过滤器?

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

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

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

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

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

过滤器的生命周期

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

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

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

a0582776741a31032da2592ce329db27.png

过滤器的执行过程

5a1d590527d6ef0b1a0bcb73fd492ea2.png

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

简单的过滤器实例

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

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

packagecom.filter;importjava.io.IOException;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;importjavax.servlet.http.HttpServletRequest;//定义类继承Filter,定义过滤器

public class myFilter implementsFilter {publicmyFilter() {

}

//销毁public voiddestroy() {

System.out.println("myFilter destroy");

}public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throwsIOException, 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) throwsServletException {

System.out.println("myFilter init");

}

}

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

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

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

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

myFilter

com.filter.myFilter

myFilter

/index.jsp

其中几个必备的项:

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

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

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

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

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

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

Insert title here

View Code

最后,当启动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

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

过滤器的部署:

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

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

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

元素用于指定过滤器的完整的限定类名。元素用于为过滤器指定初始化参数,它的子元素指定参数的名字,指定参

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

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

testFitler

org.test.TestFiter

word_file

/WEB-INF/word.txt

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

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

元素用于指定过滤器关联的url样式或者Servlet。

其中子元素的值必须是在元素中声明过的过滤器的名字。

元素和元素可以选择一个;

元素指定过滤器关联的URL样式;

元素指定过滤器对应的Servlet。

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

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

·REQUEST

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

·INCLUDE

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

·FORWARD

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

·ERROR

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

例子:

testFilter

/test.jsp

当用户访问test.jsp页面时,容器就会调用testFilter过滤器。

testFilter

/index.jsp

REQUEST

FORWARD

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值