Web过滤技术.doc_第1页
Web过滤技术.doc_第2页
Web过滤技术.doc_第3页
Web过滤技术.doc_第4页
Web过滤技术.doc_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Web过滤技术一、过滤器技术1、概述(1)常规方式的Web认证形式对于各种Web访问的预处理和后处理问题,传统上,开发人员会设计一系列额外的检测程序模块,也就是一整套if/else语句,并且指定如果其中任何一个检测失败,所有的处理工作都会退出。显然,这种方法是存在很大弊端的,即代码的可读性、可维护性都会被大大降低,同时将检测工作融于一般的程序模块,使得整个程序的模块性难以保证(因为我们这里所说的预处理和后处理功能,通常是指一些基本的系统服务,如安全、登录,系统调试等。执行这些功能的过滤器通常是需要与核心模块分开的,并且由于系统职能或规则的变化,这些模块随时可能被添加或删除)。(2)典型的Web应用的需求l 首先假设我们现在想做一个Web Application(例如BBS)。要求具备下列功能:l 在用户发帖子之前,要进行身份认证,以确认该用户是已登陆用户。l 其次是要对删除帖子,修改帖子,进行权限检查。l 访问特定资源(Web 页、JSP 页)时的身份认证那么对待这些要求我们该怎么去做,如果在每个页面中都写检查权限的代码,不是一个好想法,且使的程序的可重用性降低,对比设计模式Intercepting Filter(截获过滤)正好符合我们的要求,且在Servlet2.3中通过使用过滤器(Filter)能够使得Web Application开发者能够在请求到达Web资源之前截取请求,在处理请求之后修改应答。(3)模块化的解决方法解决这种问题的关键在于,设计一种简单的技术,以能够添加或移除额外处理的模块,而这些模块通常都能够完成一定的检测和过滤功能。根据以上的讨论,J2EE研究人员提出了设计模式-截取过滤器作为解决方案,这种模式可以在不影响核心处理模块的情况下,实现可插入的过滤器来执行一般的处理功能。(4)Web应用中的过滤器及作用Web应用中的过滤器截取从客户端的请求,并做出处理的答复。利用它可以实现验证客户是否来自可信的网络(以处理一个网站的所有客户请求并提供一个核心的认证机制)、可以对客户提交的数据进行重新编码、可以验证客户是否已经登录、可以检查客户的浏览器是否满足本应用的要求并可以产生系统日志等应用。Servlet 过滤器是可插入的 Web 组件,它允许我们实现 Web 应用程序中的预处理和后期处理逻辑(也就是说它对于客户的请求附加了额外的操作)。过滤器支持 Servlet和 JSP 页面的基本请求处理功能,比如日志记录、性能、安全、会话处理、XSLT 转换等。主要为:l 资源访问(Web 页、JSP 页、servlet)的定制身份认证l 应用程序级的访问资源的审核和记录l 应用程序范围内对资源的加密访问,它建立在定制的加密方案基础上l 对被访问资源的及时转换,包括从 servlet 和 JSP 的动态输出(5)截取过滤器的不足采用这种设计模式也会带来一定的问题,即在过滤器之间共享信息将变得非常困难,这是由于根据其定义和需求,每个过滤器的设计和开发都大相径庭。因而如果在不同的过滤器之间需要共享信息的话,其代价将是非常昂贵的。因为过滤器是独立运行的部件,也就是除了输入和输出外,每个过滤器不受任何其他过滤器运行的影响。在设计上,过滤器之间不共享任何状态信息;独立性还表现在它对其处理的上游和下游连接的过滤器是无知的。它的设计和使用不对与其连接的任何过滤器施加限制,唯一关心的是其输入数据的,然后进行加工处理,最后产生数据输出。2、Servlet 过滤器技术(1)Servlet 过滤器是什么? Servlet 过滤器是小型的 Web 组件,它们拦截请求和响应,以便查看、提取或以某种方式操作正在客户机和服务器之间交换的数据。过滤器是通常封装了一些功能的 Web 组件,这些功能虽然很重要,但是对于处理客户机请求或发送响应来说不是决定性的。典型的例子包括记录关于请求和响应的数据、处理安全协议、管理会话属性等等。过滤器提供一种面向对象的模块化机制,用以将公共任务封装到可插入的组件中,这些组件通过一个配置文件来声明,并动态地处理。(2)Servlet 过滤器的特性l 声明式的:过滤器通过 Web 部署描述符(web.xml)中的 XML 标签来声明。这样允许添加和删除过滤器,而无需改动任何应用程序代码或 JSP 页面。 l 动态的:过滤器在运行时由 Servlet 容器调用来拦截和处理请求和响应。 l 灵活的:过滤器在 Web 处理环境中的应用很广泛,涵盖诸如日志记录和安全等许多最公共的辅助任务。过滤器还是灵活的,因为它们可用于对来自客户机的直接调用执行预处理和后期处理,以及处理在防火墙之后的 Web 组件之间调度的请求。最后,可以将过滤器链接起来以提供必需的功能。 l 模块化的:通过把应用程序处理逻辑封装到单个类文件中,过滤器从而定义了可容易地从请求/响应链中添加或删除的模块化单元。 l 可移植的:与 Java 平台的其他许多方面一样,Servlet 过滤器是跨平台和跨容器可移植的,从而进一步支持了 Servler 过滤器的模块化和可重用本质。 l 可重用的:归功于过滤器实现类的模块化设计,以及声明式的过滤器配置方式,过滤器可以容易地跨越不同的项目和应用程序使用。 l 透明的:在请求/响应链中包括过滤器,这种设计是为了补充(而不是以任何方式替代)servlet 或 JSP 页面提供的核心处理。因而,过滤器可以根据需要添加或删除,而不会破坏 servlet 或 JSP 页面。3、过滤器(filters)(1)Servlet API 2.3的新特性Servlet API 2.3中最重大的改变是增加了filters,filters能够传递request或者修改response。 Filters并不是servlets;它们不能产生response。 你可以把过滤器看作是还没有到达servlet的request的预处理器,或从servlet发出的response的后处理器。过滤器是一个程序,它先于与之相关的servlet或JSP页面运行在服务器上。过滤器可附加到一个或多个servlet或JSP页面上,并且可以检查进入这些资源的请求信息。(2)filter的主要作用l 访问日志记录对于到达系统的所有请求,过滤器收集诸如浏览器类型、一天中的时间、转发 URL 等相关信息,并对它们进行日志记录。 l 利用修改过的请求信息调用资源过滤器在内容通过线路传来并在到达 servlet 和 JSP 页面之前解压缩该内容,然后再取得响应内容,并在将响应内容发送到客户机机器之前将它转换为压缩格式。 l 调用或者阻止资源调用等安全方面过滤器处理身份验证令牌的管理,并适当地限制安全资源的访问,提示用户进行身份验证和/或将他们指引到第三方进行身份验证。将安全逻辑放在过滤器中,而不是放在 servlet 或者 JSP 页面中,这样提供了巨大的灵活性。在开发期间,过滤器可以关闭(在 web.xml 文件中注释掉)。在生产应用中,过滤器又可以再次启用。此外还可以添加多个过滤器,以便根据需要提高安全、加密和不可拒绝的服务的等级。 l 会话处理将 servlet 和 JSP 页面与会话处理代码混杂在一起可能会带来相当大的麻烦。使用过滤器来管理会话可以让 Web 页面集中精力考虑内容显示和委托处理,而不必担心会话管理的细节。 (3)Servlet 2.3 规范中的过滤器过滤器在 Servlet 2.3 规范中首次引入时,它们只能过滤 Web 客户机和客户机所访问的指定 Web 资源之间的内容。如果该资源然后将请求调度给其他 Web 资源,那就不能向幕后委托的任何请求应用过滤器。Servlet 2.4 规范消除了这个限制。Servlet 过滤器现在可以应用于 J2EE Web 环境中存在请求和响应对象的任何地方。因此,Servlet 过滤器可以应用在客户机和 servlet 之间、servlet 和 servlet 或 JSP 页面之间,以及所包括的每个 JSP 页面之间。这才是我所称的强大能力和灵活性!(4)javax.servlet包中的3个接口Filter、FilterChain 和 FilterConfig从编程的角度看,过滤器类将实现 Filter 接口,然后使用这个过滤器类中的 FilterChain 和 FilterConfig 接口。该过滤器类的一个引用将传递给 FilterChain 对象,以允许过滤器把控制权传递给链中的下一个资源。FilterConfig 对象将由容器提供给过滤器,以允许访问该过滤器的初始化数据。(5)Filter接口该接口主要实现了以下方法:l public void init(FilterConfig filterConfig)throws ServletException这个方法在容器实例化过滤器时首先被调用,它主要设计用于使过滤器为处理做准备。该方法接受一个 FilterConfig 类型的对象作为输入。并且利用它能获取在 web.xml 文件中指定的filter初始化参数。l public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain)throws java.io.IOException,ServletException与 servlet 拥有一个 service() 方法(这个方法又调用 doPost() 或者 doGet())来处理请求一样,过滤器拥有单个用于处理请求和响应的方法doFilter()。这个方法接受三个输入参数:一个 ServletRequest、response 和一个 FilterChain 对象。利用该方法执行实际的过滤的操作,因为它是一个完成过滤行为的方法;同时它也是上一个过滤器调用的方法。引入的 FilterChain 对象参数的主要目的是为了向后续的过滤器提供所要调用的信息。l public void destroy():容器在销毁过滤器实例前被调用,在其中可以释放资源。(6)Filter链介绍l 过滤器链:所有过滤器都服从调用的过滤器链,并通过定义明确的接口得到执行。Web 应用程序可以指定许多过滤器来完成相关的工作,那么它们就组成一个过滤器链来完成相应的工作。l 过滤器链的结构图l doFilter()方法每个request和response都会传到filter接口的doFilter()方法中, 也就是说在FilterChain对象中包含着所有将被执行的filters。一个filter可以在doFilter()方法中对request和response进行处理。 (它能够通过调用其他的方法获得数据,或赋予获得的对象新的行为), 然后,当前的filter调用chain.doFilter()方法把控制权传递给下一个filter。在调用返回时, filter能够在doFilter()方法结束的地方,对response进行附加的处理,例如,对response进行日志管理。如果filter想停止request处理过程并获得对response的完全控制,则不要去调用下一个filter。因此过滤器可以:l 在请求得到处理以前修改请求的标题 l 提供它自己的请求版本以供处理 l 在请求处理以后和被传回给用户以前修改响应 l 先取得由容器进行的所有请求处理,并产生自己的响应4、编程实现过滤器的步骤:建立一个过滤器涉及下列五个步骤:(1)建立一个实现Filter接口的类。这个类需要三个方法,分别是:l doFilter- doFilter方法包含主要的过滤代码l init- init方法建立设置操作init方法只在此过滤器第一次初始化时执行,不是每次调用过滤器都执行它。对于简单的过滤器,可提供此方法的一个空体。但有两个原因需要使用init。u 首先,FilterConfig对象提供对servlet环境及web.xml文件中指派的过滤器名的访问。因此,普遍的办法是利用init将FilterConfig对象存放在一个字段中,以便doFilter方法能够访问servlet环境或过滤器名。u 其次,FilterConfig对象具有一个getInitParameter方法,它能够访问部署描述符文件(web.xml)中分配的过滤器初始化参数。l destroy-而destroy方法进行清除。此方法在利用一个给定的过滤器对象永久地终止服务器(如关闭服务器)时调用。大多数过滤器简单地为此方法提供一个空体,不过,可利用它来完成诸如关闭过滤器使用的文件或数据库连接池等清除任务。(2)在doFilter方法中放入过滤行为。l doFilter方法的第一个参数为ServletRequest对象。此对象给过滤器提供了对进入的信息(包括表单数据、cookie和HTTP请求头)的完全访问。l 第二个参数为ServletResponse,通常在简单的过滤器中忽略此参数。l 最后一个参数为FilterChain,此参数用来调用servlet或JSP页。doFilter方法为大多数过滤器的关键方法。每当调用一个过滤器时,都要执行doFilter。对于大多数过滤器来说,doFilter执行的步骤是基于传入的信息的。因此,可能要利用作为doFilter的第一个参数提供的ServletRequest。这个对象常常构造为HttpServletRequest类型,以提供对该类的更特殊方法的访问。Filter接口的doFilter方法以一个FilterChain对象作为它的第三个参数。在调用该对象的doFilter方法时,激活下一个相关的过滤器。这个过程一般持续到链中最后一个过滤器为止。在最后一个过滤器调用其FilterChain对象的doFilter方法时,激活servlet或页面自身。但是,链中的任意过滤器都可以通过不调用其FilterChain的doFilter方法中断这个过程。在这样的情况下,不再调用JSP页面的serlvet,并且中断此调用过程的过滤器负责将输出提供给客户机。(3)调用FilterChain对象的doFilter方法。Filter接口的doFilter方法取一个FilterChain对象作为它的一个参数。在调用此对象的doFilter方法时,激活下一个相关的过滤器。如果没有另一个过滤器与servlet或JSP页面关联,则servlet或JSP页面被激活。(4)对相应的servlet和JSP页面注册过滤器。在部署描述符文件(web.xml)中使用filter和filter-mapping元素。其中的filter元素向系统注册一个过滤对象,而filter-mapping元素指定该过滤对象所应用的URL。l filter元素:filter元素位于部署描述符文件(web.xml)的前部,所有filter-mapping、servlet或servlet-mapping元素之前。filter元素具有如下六个可能的子元素:u icon 这是一个可选的元素,它声明IDE能够使用的一个图象文件。u filter-name 这是一个必需的元素,它给过滤器分配一个选定的名字。u display-name 这是一个可选的元素,它给出IDE使用的短名称。u description 这也是一个可选的元素,它给出IDE的信息,提供文本文档。u filter-class 这是一个必需的元素,它指定过滤器实现类的完全限定名。u init-param 这是一个可选的元素,它定义可利用FilterConfig的getInitParameter方法读取的初始化参数。单个过滤器元素可包含多个init-param元素。l filter-mapping元素:filter-mapping元素位于web.xml文件中filter元素之后serlvet元素之前。它包含如下三个可能的子元素:u filter-name 这个必需的元素必须与用filter元素声明时给予过滤器的名称相匹配。u url-pattern 此元素声明一个以斜杠(/)开始的模式,它指定过滤器应用的URL。所有filter-mapping元素中必须提供url-pattern或servlet-name。但不能对单个filter-mapping元素提供多个url-pattern元素项。如果希望过滤器适用于多个模式,可重复整个filter-mapping元素。u servlet-name 此元素给出一个名称,此名称必须与利用servlet元素给予servlet或JSP页面的名称相匹配。不能给单个filter-mapping元素提供多个servlet-name元素项。如果希望过滤器适合于多个servlet名,可重复这个filter-mapping元素。体验Filter的优点用户访问验证例在许多的安全配置中,每一个JSP页面都会检验会话ID和其他一些安全性来授权一个JSP调用。你可以将这些在每个JSP页面中的检验代码移植到一个Servlet Filter中,并且确保这个Filter在调用每个Jsp页面之前被调用。这样就提高了JSPs的可维护性和可移植性。你可以仅仅的在这一个Servlet中进行一些安全检验方面的修改,或者是在其中加入一些和安全相关的代码。而不是在每一个JSP页面中进行修改。如果将来整个安全机制改变了,系统中唯一要修改的地方仅仅是这个filter,独立的JSP页面将不需要任何修改。该方法也称为GateKeeper,其基本的原理是:使用Filter来防止用户访问一些被授权的资源,因为Filter会截取所有的request/response,然后放置一个验证通过的标识在用户的session中,然后Filter每次依靠这个标识来决定是否放行response。从而实现截获过滤的作用。1、 常规的身份验证:在MVCindex.jsp中添加下面的超链接2、 对上面的updateUserInfo.jsp页面进行保护(1) 访问的要求:要想执行updateUserInfo.jsp和deleteUserInfo.jsp页面,访问者必须要进行系统登陆。(2)在登陆功能中进行会话跟踪3、采用常规的方法实现-直接在被保护(updateUserInfo.jsp和deleteUserInfo.jsp)的页面中添加脚本(1)在updateUserInfo.jsp和deleteUserInfo.jsp页面中都需要重复加下面的代码(2)测试该功能的效果输入:8080/J2EEWebApp/MVCIndex.jsp,首先不进行系统登陆,而直接点击“修改”或者“删除”的超链接则出现下面的错误提示,因此目标文件被保护了!此时,再对目标进行访问时,是允许的4、采用Filter实现上面的功能(1)添加一个Filter组件 CheckLoginFilter,包名称为com.px1987.j2eeweb.filter(2)编程该Filter组件package com.px1987.j2eeweb.filter;import java.io.IOException;import javax.servlet.*;import javax.servlet.http.*;public class CheckLoginFilter implements Filter public void destroy() public void doFilter(ServletRequest request, ServletResponse response,FilterChain arg2) throws IOException, ServletException HttpServletRequest httpRequest=(HttpServletRequest)request;HttpSession session=httpRequest.getSession();if(session.getAttribute(oneUserInfoVO)=null) /识别用户是否进行了登陆 RequestDispatcher oneRequestDispatcher= request.getRequestDispatcher(/showErrorInfo.jsp); oneRequestDispatcher.forward(request, response); return; arg2.doFilter(request,response); /继续下面的正常的请求public void init(FilterConfig arg0) throws ServletException (3)部署该Filter并且“多点”保护 CheckLoginFilter com.px1987.j2eeweb.filter.CheckLoginFilter CheckLoginFilter /deleteUserInfo.jsp CheckLoginFilter /updateUserInfo.jsp(4)除掉页面中的脚本(5)再进行测试6、从过滤器中访问Servlet环境参数的应用例对于Servlet和JSP页面,可通过提供初始化参数定制初始化行为。其编程方法基本上类似Servlet的应用。(1)定义初始化参数。使用web.xml中的filter的init-param子元素以及param-nam和param-value子元素,如下所示。 CheckLoginFilter com.px1987.j2eeweb.filter.CheckLoginFilter showErrorInfoFileName /showErrorInfo.jsp CheckLoginFilter /deleteUserInfo.jsp CheckLoginFilter /u(2)读初始化参数。从过滤器的inti方法中调用FilterConfig的getInitParameter方法。如下所示。package com.px1987.j2eeweb.filter;import java.io.IOException;import javax.servlet.*;import javax.servlet.http.*;public class CheckLoginFilter implements Filter String showErrorInfoFileName=null;public void destroy() public void doFilter(ServletRequest request, ServletResponse response,FilterChain arg2) throws IOException, ServletException HttpServletRequest httpRequest=(HttpServletRequest)request;HttpSession session=httpRequest.getSession();if(session.getAttribute(oneUserInfoVO)=null) /识别用户是否进行了登陆 RequestDispatcher oneRequestDispatcher= request.getRequestDispatcher(showErrorInfoFileName); oneRequestDispatcher.forward(request, response); return; arg2.doFilter(request,response); /继续下面的正常的请求public void init(FilterConfig arg0) throws ServletException showErrorInfoFileName=arg0.getInitParameter(showErrorInfoFileName);(3)分析并使用初始化参数。就像Servlet和JSP的初始化参数一样,每个过滤器的初始化都是String类型的。因此,如果想要其他类型的值,必须对它进行转换。例如,可用Integer.parseInt将String“7”转换为int 7。(4)再进行测试(5)修改页面文件名称此时,只需要修改web.xml文件中的目标页面为新的页面(6)再进行测试对请求的字符编码进行转换的过滤器例1、Web应用中的需求在Web应用中,经常需要对客户所提交的数据进行中文编码的设置,以便能够正确地获得所请求的数据,如果有多个页面或者需要针对整个网站进行统一的请求的字符编码。此时可以设计出一个针对客户请求的字符编码的过滤器程序。这样,可以简化页面的设计。Servlet API 2.3是为对处理不同语言的表单提交方式的迫切需要提供了新方法,request.setCharacterEncoding(String encoding),告诉Web Server一个request请求的字符编码。字符编码也叫做字符集,反映了字节到字符的映射模式。Web Server能够使用指定的字符集正确的解析参数和POST数据。缺省情况下,Web Server使用常用的Latin-1(ISO 8859-1)字符集解析参数。然而这只能在使用西方和欧洲的语言的情况下正常工作。当浏览器使用其他的字符集时,假设在request请求的Content-Type头中传送编码信息,但是没有多少浏览器这样做。通过使用这个方法,Servlet能够通知Web Server使用哪一种字符集,Web Server只需关注其余部分。例如,Servlet从以Shift_JIS编码方式的表单接受并读取Japanese参数的代码如下:req.setCharacterEncoding(Shift_JIS);/设置编码方式String name = req.getParameter(name);/采用该字符集获得请求的数据记住一定要在调用getParameter()方法或getReader()方法之前设置编码。setCharacterEncoding()对于不支持的编码会抛出java.io.UnsupportedEncodingException。程序示例请见上面的ViewCheckFilter程序。程序示例请见WebMis中的SetCharacterEncodingFilter过滤器程序。2、体验什么是中文乱码问题(1)在数据库表中添加一条(2)在Servlet中输出用户名称(3)再测试(以中文名称进行登陆)并且在控制台上出现下面的状态3、常规的解决方法-在每个程序(Servlet)中添加下面的代码request.setCharacterEncoding(gb2312);再执行前面的功能实现同时在控制台中的输出4、采用Filter组件技术实现(1)再添加一个Filter,类名称为EncodingFilter,包名称为com.px1987.j2eeweb.filter(2)编程该Filterpackage com.px1987.j2eeweb.filter;import java.io.IOException;import javax.servlet.*;public class EncodingFilter implements Filter String targetEncodeing=null;public void destroy() public void doFilter(ServletRequest request, ServletResponse response,FilterChain arg2) throws IOException, ServletException request.setCharacterEncoding(targetEncodeing);arg2.doFilter(request, response);public void init(FilterConfig arg0) throws ServletException targetEncodeing=arg0.getInitParameter(targetEncodeing);(3)部署该Filter EncodingFilter com.px1987.j2eeweb.filter.EncodingFilter targetEncodeing gb2312 EncodingFilter /userInfoServlet (4)再测试8、Filter过滤器链例下面给出两个Filter过滤器,其中一个过滤器,完成字符集的编码的转化,如大家经常遇到的汉字编码问题,你只需配置为GBK即可。它从Web.xml之中读取这些参数的配置信息,然后进行编码的转化。另一个是安全校验Fliter,它负责进行安全检查哪些页面可以被访问,哪些不可。它们组成一个Filter链。(1)结构图和实现代码如下:(2)程序代码(3)web.xml文件:按照两个Filter过滤器的顺序组成一个过滤器链注意:过滤器链排列顺序的重要性过滤器链式排列的顺序取决于 web.xml 描述信息内 语句的顺序。在大多数情况下,过滤器链式排列的顺序是非常重要的。也就是说,在应用 A 过滤器前使用 B 过滤器与在使用 B 过滤器前使用 A 过滤器所得到的结果是完全不同的。如果一个应用程序中使用了一个以上的过滤器,那么在写入 语句的时候要小心。9、下面提供一个示例演示通过修改返回数据(通过过滤器把response的字符串变成大写)该示例使用HttpServletResponseWrapper技术,它是对HttpServletResponse的包装, 其实就是装饰(decorate)设计模式的应用。该例子能够工作的关键是UCaseResponse和UCaseWriter类,它实现了对每个要输出的字符都转成了大写后再写入实际的输出流的功能public class UCaseResponse extends HttpServletResponseWrapper public UCaseResponse(HttpServletResponse response) super(response); public PrintWriter getWriter() throws IOException return new UCaseWriter(super.getWriter(); public class UCaseWriter extends PrintWriter public UCaseWriter(Writer out) super(out); public void write(int c) super.write(Character.toUpperCase( (char) c); public void write(char buf, int off, int len) for (int i = 0;i len;i+) write(bufoff + i); public void write(String s, int off, int len) for (int i = 0;i len;i+) write(s.charAt(off + i); public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) try filterChain.doFilter(request, new UCaseResponse(HttpServletResponse)(response); catch(Exception sx) filterConfig.getServletContext().log(sx.getMessage(); 日志过滤器应用例1、ServletContext类的log()方法为了实现访问日志,需要从过滤器中访问Servlet上下文环境ServletContext类的方法。这可以通过在Servlet API中提供的两个log方法来达到。public void log(java.lang.Stringmsg)public void log(java.lang.Stringmessage, java.lang.Throwablethrowable)2、用FilterConfig类中的getServletContext()方法来获得ServletContext类对象上面的两个log()方法都可以从GenericServlet或ServletContext类中使用。但由于doFilter方法在与其相关的Serlvet或JSP页面之前执行。因此,在doFilter方法中不能访问该Servlet的实例,从而不能调用从GenericServlet继承的log方法。此外,Servlet API没有提供从doFilter方法中访问ServletContext的简单方法。可以访问ServletContext的方法并且与过滤器相关的唯一类是FilterConfig,访问ServletContext的方法为getServletContext。因此,在过滤器的程序中定义一个FilterConfig类型的对象,然后重写init,将它的参数分配给该FilterConfig类型的对象。因为一般只使用FilterConfig对象来访问ServletContext和过滤器名。3、添加一个Filter组件LogFilter,包名称为com.px1987.j2eeweb.filter编程该Filter组件package com.px1987.j2eeweb.filter;import java.io.IOException;import javax.servlet.*;import javax.servlet.http.*;import java.util.*;public class LogFilter implements Filter ServletContext application=null;public void destroy() public void doFilter(ServletRequest request, ServletResponse response,FilterChain arg2) throws IOException, ServletException String logInfoText=null; HttpServletRequest httpRequest=(HttpServletRequest)request; logInfoText=httpRequest.getRemoteHost()+访问+httpRequest.getRequestURL()+,时间为+new Date().toLocaleString(); application.log(logInfoText); arg2.doFilter(request, response);public void init(FilterConfig arg0) throws ServletException application=arg0.getServletContext();4、部署该Filter LogFilter com.px1987.j2eeweb.filter.LogFilter LogFilter /*5、再进行测试同时在logs目录中出现下面的日志文件但注意:在Tomcat的server.xml中的配置项目应该要启用日志记录。6、对前面的日志记录功能进行优化以增加时间段(1)开始时间和结束时间 LogFilter com.px1987.j2eeweb.filter.LogFilter startTime 13 endTime 18 (2)在LogFilter类中获得时间值package com.px1987.j2eeweb.filter;import java.io.IO

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论