《Java Web开发从入门到实战(IntelliJ IDEA版·微课视频版)》 课件 第6章 过滤器与监听器_第1页
《Java Web开发从入门到实战(IntelliJ IDEA版·微课视频版)》 课件 第6章 过滤器与监听器_第2页
《Java Web开发从入门到实战(IntelliJ IDEA版·微课视频版)》 课件 第6章 过滤器与监听器_第3页
《Java Web开发从入门到实战(IntelliJ IDEA版·微课视频版)》 课件 第6章 过滤器与监听器_第4页
《Java Web开发从入门到实战(IntelliJ IDEA版·微课视频版)》 课件 第6章 过滤器与监听器_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

第6章过滤器与监听器学习目的与要求本章主要介绍过滤器与监听器的概念、原理以及实际应用。通过本章的学习,理解过滤器与监听器的原理,掌握过滤器与监听器的实际应用。《JavaWeb开发从入门到实战(微课视频版)(IntelliJIDEA版)》陈恒

主编,清华大学出版社,2024

学习目的与要求《JavaWeb开发从入门到实战(微课视频版)(IntelliJIDEA版)》陈恒

主编,清华大学出版社,2024

6.1Filter类与Filter对象6.2Filter对象的部署与运行6.3过滤器的实际应用6.4监听器的分类与创建6.5监听器的实际应用——统计在线用户6.1Filter类与Filter对象过滤器位于服务器处理请求之前或服务器响应请求之前。也就是说,它可以过滤浏览器对服务器的请求,也可以过滤服务器对浏览器的响应。《JavaWeb开发从入门到实战(微课视频版)(IntelliJIDEA版)》陈恒

主编,清华大学出版社,2024

浏览器Web服务器Servlet处理请求响应请求HTTP请求HTTP响应过滤后的请求图6.1过滤器过滤器过滤器过滤前的响应6.1Filter类与Filter对象编写一个过滤器类很简单,只要实现jakarta.servlet包中的Filter接口。实现Filter接口的类习惯地称为一个Filter类,这样的类创建的对象又习惯地称为Filter对象。Filter接口与Servlet接口很类似,同样都有init()与destroy()方法,还有一个doFilter()方法类似于Servlet接口的service()方法。 publicvoidinit(FilterConfig

fConfig)throwsServletException publicvoiddoFilter(ServletRequest

request,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException publicvoiddestroy()《JavaWeb开发从入门到实战(微课视频版)(IntelliJIDEA版)》陈恒

主编,清华大学出版社,2024

init(FilterConfigfConfig) publicvoidinit(FilterConfigfConfig)throwsServletException该方法的功能是初始化过滤器对象。如果为过滤器设置了初始参数,则可以通过FilterConfig的getInitParameter(StringparamName)方法获得初始参数值。《JavaWeb开发从入门到实战(微课视频版)(IntelliJIDEA版)》陈恒

主编,清华大学出版社,2024

doFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain) publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException当Web服务器使用Servlet对象调用service()方法处理请求前,发现应用了某个过滤器时,Web服务器就会自动调用该过滤器的doFilter()方法。在doFilter()方法中有这样一条语句:chain.doFilter(request,response);如果执行了该语句,就会执行下一个过滤器,如果没有下一个过滤器,就返回请求目标程序。如果因为某个原因没有执行“chain.doFilter(request,response);”,则请求就不会继续交给以后的过滤器或请求目标程序,这就是所谓的拦截请求。《JavaWeb开发从入门到实战(微课视频版)(IntelliJIDEA版)》陈恒

主编,清华大学出版社,2024

destroy()

publicvoiddestroy()当Web服务器终止服务时,destroy()方法会被执行,使Filter对象消亡。【例6-1】在Web项目ch6中,编写一个简单的Filter类FirstFilter,Filter类的功能要求:无论用户请求该Web项目的哪个页面或Servlet,都会在浏览器中先出现“首先执行过滤器”这样的响应信息。《JavaWeb开发从入门到实战(微课视频版)(IntelliJIDEA版)》陈恒

主编,清华大学出版社,2024

学习目的与要求《JavaWeb开发从入门到实战(微课视频版)(IntelliJIDEA版)》陈恒

主编,清华大学出版社,2024

6.1Filter类与Filter对象6.2Filter对象的部署与运行6.3过滤器的实际应用6.4监听器的分类与创建6.5监听器的实际应用——统计在线用户6.2.1在web.xml中部署过滤器<filter> <filter-name>firstFilter</filter-name> <filter-class>filter.FirstFilter</filter-class></filter><filter-mapping> <filter-name>firstFilter</filter-name> <url-pattern>/*</url-pattern></filter-mapping>《JavaWeb开发从入门到实战(微课视频版)(IntelliJIDEA版)》陈恒

主编,清华大学出版社,2024

2.运行Filter只要用户请求的URL和<filter-mapping>的子标记<url-pattern>指定的模式匹配的话,Web服务器就会自动调用该Filter的doFilter()方法。如6.1节中的FirstFilter过滤器在web.xml中的<url-pattern>指定值为/*,“/*”代表任何页面或Servlet的请求。为了测试过滤器,在web项目ch6中新建一个JSP页面test.jsp,运行test.jsp显示如图6.2的结果。《JavaWeb开发从入门到实战(微课视频版)(IntelliJIDEA版)》陈恒

主编,清华大学出版社,2024

6.2.2基于注解的方式部署过滤器从Servlet3.0开始提供了注解@WebFilter,使得不再需要在web.xml文件中进行Filter的部署描述。但在实际的Web项目中,不需要大量开发Filter,因此,采用哪种方式部署过滤器都不太麻烦。@WebFilter用于将一个类声明为过滤器,该注解将会在部署时被容器处理,容器将根据具体的属性配置,将相应的类部署为过滤器。《JavaWeb开发从入门到实战(微课视频版)(IntelliJIDEA版)》陈恒

主编,清华大学出版社,2024

属性名类

型描

述filterNameString指定过滤器的name属性,等价于<filter-name>。valueString[]该属性等价于urlPatterns属性,但两个属性不能同时使用。urlPatternsString[]指定一组过滤器的URL匹配模式。等价于<url-pattern>标签。servletNamesString[]指定过滤器将应用于哪些Servlet。取值是@WebServlet中的name属性的取值,或者是web.xml中<servlet-name>的取值。initParamsWebInitParam[]指定一组过滤器初始化参数,等价于<init-param>标签。6.2.2基于注解的方式部署过滤器【例6-2】基于注解的Filter——SecondFilter。@WebFilter(filterName

="secondFilter",urlPatterns={"/*"})publicclassSecondFilterimplementsFilter{}《JavaWeb开发从入门到实战(微课视频版)(IntelliJIDEA版)》陈恒

主编,清华大学出版社,2024

6.2.3过滤器的执行顺序为了验证过滤器的执行顺序,新建SecondFilter、ThreeFilter、FourFilter和ZFilter。其中SecondFilter、ThreeFilter和FourFilter使用注解的方式部署,它们的urlPatterns都是"/*";而ZFilter在web.xml中部署,并部署在FirstFilter的前面。从图6.3可以看出,过滤器拦截路径相同时,首先按照<filter-mapping>标记在web.xml中出现的先后顺序执行过滤器,然后再按照过滤器类名的字典顺序执行注解的过滤器。《JavaWeb开发从入门到实战(微课视频版)(IntelliJIDEA版)》陈恒

主编,清华大学出版社,2024

6.2.4实践环节——过滤器的初始化参数给6.2.3节中的SecondFilter添加初始化参数,并在该过滤器的init()方法中获取这些参数。@WebInitParam注解给过滤器添加参数的示例代码如下:@WebFilter(filterName="xxxFilter",urlPatterns={"/*"},initParams={ @WebInitParam(name="firstParam",value="one"), @WebInitParam(name="secondParam",value="two")})《JavaWeb开发从入门到实战(微课视频版)(IntelliJIDEA版)》陈恒

主编,清华大学出版社,2024

学习目的与要求《JavaWeb开发从入门到实战(微课视频版)(IntelliJIDEA版)》陈恒

主编,清华大学出版社,2024

6.1Filter类与Filter对象6.2Filter对象的部署与运行6.3过滤器的实际应用6.4监听器的分类与创建6.5监听器的实际应用——统计在线用户6.3.1字符编码过滤器在本书的3.1.3节中,介绍了中文乱码的解决方法,其中一种解决方法是:在获取表单信息之前,使用request对象调用setCharacterEncoding(String

code)方法设置统一字符编码。使用该方法解决中文乱码问题时,接受参数的每个页面或Servlet都需要执行request.setCharacterEncoding("XXX")语句。为了避免每个页面或Servlet都编写request.setCharacterEncoding("XXX")语句,可以使用过滤器进行字符编码处理。【例6-3】字符编码过滤器——SetCharacterEncodingFilter。《JavaWeb开发从入门到实战(微课视频版)(IntelliJIDEA版)》陈恒

主编,清华大学出版社,2024

6.3.2登录验证过滤器在Web项目中,某些页面或Servlet只有用户登录成功才能访问。如果直接在应用程序每个相关的源代码中进行判断用户是否登录成功,并不是科学的做法。这时可以实现一个登录验证过滤器,不用在每个相关的源代码中验证用户是否登录成功。【例6-4】按照1.2.2节的操作步骤,创建一个Web项目loginValidate,并为loginValidate添加Tomcat依赖。在该Web项目中至少编写两个JSP页面:login.jsp与loginSuccess.jsp,一个Servlet(由LoginServlet.java负责创建)。用户在login.jsp页面中输入用户名和密码后,提交给Servlet,在Servlet中判断用户名和密码是否正确,若正确跳转到loginSuccess.jsp,若错误回到login.jsp页面。但该Web项目有另外一个要求:除了访问login.jsp页面和LoginServlet外,别的页面或Servlet都不能直接访问,必须先登录成功才能访问。在设计这个Web项目时,编写了一个登录验证过滤器并在该Web项目中使用。《JavaWeb开发从入门到实战(微课视频版)(IntelliJIDEA版)》陈恒

主编,清华大学出版社,2024

学习目的与要求《JavaWeb开发从入门到实战(微课视频版)(IntelliJIDEA版)》陈恒

主编,清华大学出版社,2024

6.1Filter类与Filter对象6.2Filter对象的部署与运行6.3过滤器的实际应用6.4监听器的分类与创建6.5监听器的实际应用——统计在线用户6.4监听器的分类与创建创建不同功能的监听器类,需要实现不同的监听接口。一个监听类可以实现多个接口,即可以多种功能的监听器一起工作。根据监听的对象可将监听器划分为:ServletContext对象监听器、HttpSession对象监听器以及ServletRequest对象监听器。根据监听的事件可将监听器划分为:对象自身的创建和销毁的监听器、对象中属性的创建、修改和消除的监听器以及session中某个对象状态变化的监听器。《JavaWeb开发从入门到实战(微课视频版)(IntelliJIDEA版)》陈恒

主编,清华大学出版社,2024

6.4.1监听对象自身创建和销毁的监听器HttpSessionListener、ServletContextListener和ServletRequestListener监听接口分别监听session、context和request对象的创建与销毁。

HttpSessionListener:监听session的创建与销毁。创建session时执行sessionCreated(HttpSessionEvent

se)方法。超时或执行session.invalidate()时执行sessionDestroyed(HttpSessionEvent

se)方法。该监听器可用于统计在线人数、记录访问日志等。

ServletContextListener:监听context的创建与销毁。context代表当前Web应用程序。服务器启动时执行contextInitialized(ServletContextEventsce)方法。服务器关闭时执行contextDestroyed(ServletContextEvent

sce)方法。该监听器可用于启动时获取web.xml中配置的初始化参数,可作为定时器、加载全局属性对象、创建全局数据库连接、加载缓存信息等。

ServletRequestListener:监听request的创建与销毁。用户每次请求request都将执行requestInitialized(ServletRequestEvent

sre)方法。request处理完毕自动销毁前执行requestDestroyed(ServletRequestEvent

sre)方法。该监听器可用于读取request参数,记录访问历史。《JavaWeb开发从入门到实战(微课视频版)(IntelliJIDEA版)》陈恒

主编,清华大学出版社,2024

6.4.1监听对象自身创建和销毁的监听器【例6-5】在ch6的src目录下创建一个名为listener的包,并在包中创建一个名为MyObjectListener的监听器类,该监听器类实现HttpSessionListener、ServletContextListener和ServletRequestListener监听接口。在web.xml文件中部署监听器,示例代码如下:<listener>

<listener-class>完整类名</listener-class></listener>监听器的启动顺序是按照web.xml的配置顺序来启动;加载顺序是按照“监听器->过滤器->Servlet”顺序加载。《JavaWeb开发从入门到实战(微课视频版)(IntelliJIDEA版)》陈恒

主编,清华大学出版社,2024

6.4.2监听对象属性变化的监听器监听对象属性变化的监听器,分别为HttpSessionAttributeListener、ServletContextAttributeListener、ServletRequestAttributeListener。此3个监听接口分别用于监听session、context和request的属性变化。当向被监听对象中添加、更新、移除属性时,将分别执行attributeAdded、attributeReplaced、attributeRemoved方法。【例6-6】在ch6的listener包中创建一个名为MyAttributeListener的监听器类,该监听器类实现HttpSessionAttributeListener监听接口。《JavaWeb开发从入门到实战(微课视频版)(IntelliJIDEA版)》陈恒

主编,清华大学出版社,2024

6.4.3监听session中某个对象状态变化的监听器监听绑定到HttpSeesion域中某个对象状态的事件监听器有HttpSessionBindingListener和HttpSessionActivationListener。HttpSession中对象的状态有:绑定→解除绑定,钝化→活化。绑定,通过setAttribute保存到session对象当中。解除绑定,通过removeAttribue去除绑定。钝化,将session对象持久化到存储设备上。活化,将session对象从存储设备上进行恢复。被实现钝化和活化的监听器对象必须实现Serializable接口,不需要在web.xml中部署。

HttpSessionBindingListener:当对象被放到session里时,执行valueBound(HttpSessionBindingEvent

event)方法。当对象被从session里移除时,执行valueUnbound(HttpSessionBindingEvent

event)方法。对象必须实现该监听接口。

HttpSessionActivationListener:当session里的对象被钝化时,执行sessionWillPassivate(HttpSessionEvent

se)方法。当对象被重新加载(活化)时,执行sessionDidActivate(HttpSessionEventse)方法。对象必须实现该监听接口。《JavaWeb开发从入门到实战(微课视频版)(IntelliJIDEA版)》陈恒

主编,清华大学出版社,2024

6.4.3监听session中某个对象状态变化的监听器【例6-7】在ch6的listener包中创建一个名为MySeesionListener的监听器类,该监听器类实现HttpSessionBindingListener、HttpSessionAc

温馨提示

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

评论

0/150

提交评论