ImageVerifierCode 换一换
格式:DOC , 页数:13 ,大小:189.50KB ,
资源ID:6635129      下载积分:10 金币
快捷注册下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/6635129.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请

   平台协调中心        【在线客服】        免费申请共赢上传

权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

注意事项

本文(JavaWeb_10_过滤器.doc)为本站上传会员【pc****0】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

JavaWeb_10_过滤器.doc

1、 第1章 过滤器 在前面的章节分别学习了Servlet技术JSP技术,从本章开始我们将学习一些在Web应用程序中扮演特殊角色的技术、以及一些使用的功能。 在Web应用程序中经常需要处理或控制一些客户端请求以及响应。比如:请求信息编码处理、响应信息编码处理、权限验证、防盗链等。这些使用普通的JSP和Servlet实现很繁琐,因为需要在每个JSP和Servlet中编写一段相同的代码,不利于系统的维护。使用本章讲解的过滤器就可以解决这类问题。 1.1 过滤器介绍 Servlet过滤器是J2EE Web应用程序级的Java代码组件,是一种类似于Servlet,由容器管理的对象,它能够

2、以声明的方式插人到HTTP请求响应的过程中。它们拦截请求和响应,以便查看、提取或以某种方式操作正在客户机和服务器之间交换的数据。它是通常封装了一些功能的类,实现了对Web应用程序中的预处理和后期处理逻辑。 过滤器提供一种面向对象的模块化机制,用以将公共任务封装到可插入的组件中。这些组件通过Web部署描述符(web.xml)配置文件来声明,可以方便地添加和删除过滤器,无需改动任何应用程序代码或JSP页面,并由Servlet容器进行动态调用。通过在请求/响应链中使用过滤器,可以对应用程序(而不是以任何方式替代)的Servlet或JSP页面提供的核心处理进行补充,而不会破坏Servlet或JSP页

3、面的功能。由于是纯Java实现,所以Servlet过滤器是跨平台和跨容器可移植的,从而进一步支持了Servler过滤器的模块化和可重用性,使得它们很容易地被部署到任何相容的J2EE环境中。 图1-1 过滤器原理 如图1-1所示,当客户端发出Web资源的请求时,Web服务器根据应用程序配置文件设置的过滤规则进行检查,客户请求满足过滤规则,则对客户请求/响应进行拦截,对请求头和请求数据进行检查或改动,并依次通过过滤器链,最后把请求/响应交给请求的Web资源处理。请求信息在过滤器链中可以被修改,也可以根据条件让请求不发往资源处理器,并直接向客户机发回一个响应。 当资源处理器完成了对资源的

4、处理后,响应信息将逐级逆向返回。同样在这个过程中,用户可以修改响应信息,从而完成一定的任务。如图1-1所示:在Servlet2.4规范中对2.3规范进行了扩展,使得Servlet过滤器可以应用在客户机和Servlet之间、Servlet和Servlet、Servlet和JSP页面之间、以及各个JSP页面之间。 1.2 过滤器API Servlet过滤器API包含了3个接口,它们都在javax.servlet包中,分别是Filter接口、FilterChain接口和FilterConfig接口。 1、Filter接口 所有的过滤器都必须实现Filter接口。Filter接口定义了过滤器

5、的相关规范,主要定义了init()、doFilter()、destory()三个方法,其源代码如下: package javax.servlet; import java.io.IOException; public interface Filter{ public abstract void init(FilterConfig filterconfig) throws ServletException; public abstract void doFilter(ServletRequest servletrequest, ServletRespon

6、se servletresponse, FilterChain filterchain) throws IOException, ServletException; public abstract void destroy(); } l init():当开始使用servlet过滤器服务时,Web容器调用此方法一次,为服务准备过滤器;然后在需要使用过滤器的时候调用doFilter(),传送给此方法的FilterConfig对象,包含servlet过滤器的初始化参数。 l doFilter():每个过滤器都接受当前的请求和响应,而FilterChain包含的过滤器则仍然必须被处

7、理。doFilter()方法中,过滤器可以对请求和响应做它想做的一切,通过调用他们的方法收集数据,或者给对象添加新的行为。过滤器通过传送至此方法的FilterChain参数,调用chain.doFilter()将控制权传送给下一个过滤器。当这个调用返回后,过滤器可以在它的doFilter()方法的最后对响应做些其他的工作。如果过滤器想要终止请求的处理或得到对响应的完全控制,则可以不调用下一个过滤器,而将其重定向至其它一些页面。当链中的最后一个过滤器调用chain.doFilter()方法时,将运行最初请求的Servlet。 l destroy():一旦doFilter()方法里的所有线程退出

8、或已超时,容器调用此方法。服务器调用destory()以指出过滤器已结束服务,用于释放过滤器占用的资源。 2、FilterChain接口 接口Filter的方法doFilter()是由Servlet容器提供给开发者的,用于对资源请求过滤链的依次调用,通过FilterChain调用过滤链中的下一个过滤器,如果是最后一个过滤器,则下一个就调用目标资源。 3、FilterConfig接口 检索过滤器名、初始化参数以及活动的Servlet上下文。该接口提供了以下四个方法: l getFilterName()返回web.xml部署文件中定义的该过滤器的名称。 l getServletCont

9、ext()返回调用者所处的servlet上下文。 l getInitParameter(String)返回过滤器初始化参数值的字符串形式,当参数不存在时,返回null.name初始化参数名。 l getInitParameterNames()以Enumeration形式返回过滤器所有初始化参数值,如果没有初始化参数,返回为空。 在编写Filter实现类是,并不用关心FilterChain、FilterConfig的实现类,因为在Filter实现类中,这两个接口的引用是由服务器创建,如Tomcat服务器。 1.3 过滤器的使用 过滤器的使用分为两步:一是创建过滤器类,实现功能的封装;

10、二是在web.xml中配置过滤器的过滤范围,使之生效。如使用过滤器来处理如例1-1所示的Servlet信息。 例1-1:DisplayServlet package com.create.javaWeb.ch10; public class DisplayServlet extends HttpServlet { /** * get请求处理方法 */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOEx

11、ception { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("Java WEB编程!"); out.flush(); out.close(); } } 由于没有进行中文处理,响应的中文内容将以乱码的形式显示在页面,如图1-2所示。 图1-2 未处理编码的servlet 1.3.1 创建过滤器 创建过滤器很简单,只要实现Filter接口、并实现相应的方法即可。如常用的过滤器之一就是请求、响应对象的编码处理

12、过滤器实现代码如例1-2所示。 例1-2:中文处理过滤器 package com.create.javaWeb.ch10; 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.S

13、ervletResponse; public class EncodingFilter implements Filter { /** * 初始化方法 */ public void init(FilterConfig arg0) throws ServletException { } /** * 过滤方法 */ public void doFilter(ServletRequest request, ServletResponse response, FilterChain ft) throws IOException, Servlet

14、Exception { //设置请求对象、响应对象编码格式 request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); //将请求发送给目标资源 ft.doFilter(request, response); } /** * 销毁方法 */ public void destroy() { } } 在过滤器中doFilter()方法是过滤的主方法,在该方法中如果想让请求通过过滤器访问目标,就必须调用FilterChain对象的foFi

15、lter()方法,否则请求将被阻止。 1.3.2 过滤器配置 创建的过滤器只是一个普通的实现了Filter接口的java类,想让该类实现过滤功能,就必须在web.xml中配置,让其发挥作用。在web.xml中使用filter、filter-mapping以及其子标签实现过滤器的配置,比如配置中文处理过滤器的代码如下: encoding com.create.javaWeb.ch1

16、EncodingFilter encoding /* 在web.xml配置文件中: l filter标签:用于配置一个过滤器。通过子标签filter-name为过滤器取名,子标签filter-class指定过滤器实现类的包路径即类名。 l filter-mapping标签:用于指定某个过滤的过滤范围。通

17、过子标签filter-name指定配置的过滤器名,和filter标签中配置的名称相对应;子标签url-pattern指定过滤范围,当要过滤某个目录下所有的请求时使用“*”代替、或者单独配置某一个确切的路径,如: /servlet/DisplayServlet 但是不能使用后缀名匹配的方式、如“/*.jsp”就是错误的。在上面的配置中“/*”代表该过滤器对当前web应用程序的所有请求都起作用。一个filter可以配置多个filter-mapping。 重新启动服务器,过滤器将过滤响应的请求。此时访问DisplayServlet将看到如图

18、1-3所示的效果。 图1-3 过滤器处理中文效果 1.3.3 过滤器参数 过滤器想Servlet一样可以配置一些初始化参数,这些参数可以灵活控制过滤器的运行。过滤器的初始化参数可以通过web.xml中的init-param标签配置。如例1-3通过init-param在web.xml中配置编码过滤器的初始化参数。 例1-3:过滤器初始化参数 encoding com.

19、create.javaWeb.ch1.EncodingFilter encodingType GBK encoding /*

20、p> 在过滤器实现类EncodingFilter中修改代码如下: public class EncodingFilter implements Filter { private String encoding = "UTF-8"; /** * 初始化方法 */ public void init(FilterConfig conf) throws ServletException { //通过名称得到web.xml中配置的初始化参数 this.encoding = conf.getInitParameter("encodingType");

21、} /** * 过滤方法 */ public void doFilter(ServletRequest request, ServletResponse response, FilterChain filter) throws IOException, ServletException { //设置请求对象、响应对象编码格式 request.setCharacterEncoding(this.encoding); response.setCharacterEncoding(this.encoding); //将请求发送给目标资源 fil

22、ter.doFilter(request, response); } /** * 销毁方法 */ public void destroy() { } } 在初始化方法中,通过FilterConfig得到初始化参数,名称必须和web.xml中的参数名相对应。重启服务器,访问DisplayServlet内容如图1-4所示。 图1-4 过滤器参数设置编码 1.4 过滤器生命周期 过滤器的生命周期和Servlet的生命周期基本一致,主要包含:类加载、实例化、初始化、过滤、销毁。其中类加载、实例化、初始化工作是在服务器启动时就执行、过滤是在每次访问时执行

23、销毁时在服务器停止时执行。如例1-4所示,在每个生命周期方法中打印相应的提示信息,用于观察过滤器的生命周期。 例1-4:过滤器生命周期 package com.create.javaWeb.ch10; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.S

24、ervletRequest; import javax.servlet.ServletResponse; public class LifeFilter implements Filter { public LifeFilter(){ System.out.println("------实例化------"); } public void destroy() { System.out.println("------销 毁------"); } public void doFilter(ServletRequest arg0, Servle

25、tResponse arg1, FilterChain arg2) throws IOException, ServletException { System.out.println("------过 滤------"); arg2.doFilter(arg0, arg1); } public void init(FilterConfig arg0) throws ServletException { System.out.println("------初始化------"); } } 在web.xml中配置过滤器的有效范如下:

26、 life com.create.javaWeb.ch1.LifeFilter life /* 通过配置可以看出,LifeFilter过滤器对该web应用程序下的所有请求都起作用。当启动web应用程序是可以看到如图1-5所示的LifeFilter启动信息。 图

27、1-5 启动服务 当访问服务器上的每一个资源时都将看到如图1-6所示的LifeFilter过滤信息。 图1-6 访问web资源 当服务器停止时将执行销毁方法。 1.5 过滤器链 当多个过滤器对同一资源路径有效时就形成了过滤器链,也就是说在同一个Web应用程序中有多个过滤器。过滤器链的原理就像现实生活中一道一道的门,比如在卧室有你所想要的东西,你必须点通过房屋的大门进入客厅,然后再经过卧室的门进入卧室,取得你所需要的东西,然后走出卧室、再走出房屋。这里的房屋就相当于web应用程序、卧室存放的物品就是web应用程序中的资源、门就相当于过滤器(大门是第一个过滤器、卧室的门是第二个

28、过滤器)。从这个例子我们可以看出在多个过滤器作用于同一个web资源是,过滤器的过滤顺序是先进后出的原则。其原理如图1-7所示。 图1-7 过滤器链 例1-5:过滤器链 本例通过在每个过滤器中打印相应的提示信息来观察过滤器链的执行过程。创建过滤器OneFilter、TwoFilter、test.jsp即配置内容非别如下: OneFilter package com.create.javaWeb.ch10; //导包 public class OneFilter implements Filter { public void destroy() {} pub

29、lic void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException { System.out.println("------OneFilter begin------"); arg2.doFilter(arg0, arg1); System.out.println("------OneFilter end------"); } public void init(FilterConfig arg0) th

30、rows ServletException {} } TwoFilter package com.create.javaWeb.ch10; //导包 public class TwoFilter implements Filter { public void destroy() {} public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException { System.out.println(

31、"------TwoFilter begin------"); arg2.doFilter(arg0, arg1); System.out.println("------TwoFilter end------"); } public void init(FilterConfig arg0) throws ServletException {} } web.xml配置 one com.create.javaWeb.ch1.OneFilter

32、ter-class> one /* two com.create.javaWeb.ch1.TwoFilter two

33、e> /* test.jsp <%@ page language="java" pageEncoding="UTF-8"%> test <% System.out.println("------test.jsp 资源------"); %> This is my JSP page.
当访问web应用程序资源test.jsp时将看到如图1-8所示的过滤器链执行流程。 图1-8 过滤器链 由图1-8可以看出过滤器链中的过滤器执行是先进后出的原则,通过修改web.xml中过滤器的配置顺序可以改变过滤器链中每个过滤器的先后顺序,web.xml中配置在前的过滤器将先执行、配置在后的过滤器将后执行。 - 12 -

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服