Web基础了解版10-Filter-Listener
Filter
对于WEB应用来说,过滤器是一个驻留在服务器中的WEB组件,他可以截取客户端和WEB资源之间的请求和响应信息。
在一个WEB应用中可以部署多个过滤器,多个过滤器就组成了一个过滤器链,请求和响应必须在经过多个过滤器后才能到达目标
当配置多个Filter以后就有一个执行顺序的问题,实际执行顺序是按照在web.xml文件中servlet-mapping的顺序决定的,如果顺序越靠前越先被调用。
Filter接口
Filter是一个接口。
Filter是Java Web三大组件之一。(JavaWeb三大组件分别是:Servlet小程序、Filter过滤器、Listener监听器)
作用:1.检查用户访问权限
2.设置请求响应编码,解决乱码问题
主要API
Filter
init(FilterConfig)方法用于初始化Filter
doFilter(ServletRequest,ServletResponse,FilterChain)作用和service()方法类似,是过滤请求和响应的主要方法。
destroy()用于在Filter对象被销毁前做一些收尾工作。如:释放资源等。
FilterConfig
FilterConfig对象在服务器调用init()方法时传递进来。
getFilterName() 获取Filter的名字
getServletContext() 获取ServletContext对象(即application)
getInitParameter(String) 获取Filter的初始化参数
getInitParameterNames() 获取所有初始化参数的名字
FilterChain
FilterChain对象是在doFilter()方法被调用时作为参数传递进来的。
doFilter(ServletRequest,ServletResponse)方法用于调用Filter链上的下一个过滤器,如果当前过滤器为最后一个过滤器则将请求发送到目标资源。
web.xml文件中的Filter配置
<filter-mapping>
<!-- Filter的名字 -->
<filter-name>Filter1</filter-name>
<!-- Filter1的过滤地址,表示过滤http://127.0.0.1:8080/day17/admin/user.jsp-->
<url-pattern>/admin/user.jsp</url-pattern>
</filter-mapping>
除此之外在filter-mapping还有一个子标签dispatcher,该标签用来指定需要Filter处理的请求类型
<!-- 用户直接访问资源时,会调用Filter -->
<dispatcher>REQUEST</dispatcher> <!-- 通过转发访问时,会调用Filter -->
<dispatcher>FORWARD</dispatcher> <!-- 通过动态包含获取时,会调用Filter -->
<dispatcher>INCLUDE</dispatcher> <!-- 当通过异常处理访问页面时,会调用Filter -->
<dispatcher>ERROR</dispatcher>
这四种情况可以设置一个,也可以同时设置多个,如果不设置那么默认为REQUEST
Filter生命周期
先执行Filter的构造方法
然后执行Filter的init()方法,对象创建后,马上就被调用,对Filter做一些初始化操作
执行Filter的doFilter()方法,每次访问目标资源,只要匹配过滤的地址,就会调用。
执行Filter的destroy()方法,服务器停止时调用,用来释放资源。
FilterConfig类
作用:
获取Filter在web.xml文件中配置的名称
获取Filter在web.xml文件中配置的初始化参数
通过FilterConfig类获取ServletContext对象实例
// 获取Filter的名称
String filterName = filterConfig.getFilterName();// 获取初始化参数。username的值
String username = filterConfig.getInitParameter("username");// 获取ServletContext的对象实例
ServletContext ctx = filterConfig.getServletContext();
FilterChain过滤器链
FilterChain是整个Filter过滤器的调用者。Filter与Filter之间的传递,或者Filter与请求资源之间的传递都靠FilterChain.doFilter方法。
一般Filter.doFilter中的代码分为三段:
第一段是FilterChain.doFilter之前的代码。一般用来做请求的拦截,检查用户访问的权限,访问日记的记录。参数编码的设置等等操作。
第二段是FilterChain.doFilter方法。此方法可以将代码的执行传递到下一个Filter中。或者是传递到用户最终访问的资源中。
第三段是FilterChain.doFilter之后的代码。主要用过做一些日志操作。我们很少会在第三段中做太多复杂的操作。
在每一个Filter类的doFilter方法中,一定要调用chain.doFilter方法,除非你想要阻止用户继续往下面访问。否则一定要调用FilterChain的doFilter方法。
Filter的拦截路径
主要有以下两种
第一种:通过filter-mapping的url-pattern来配置(与Servlet的url-pattern的规则相同)
精确匹配:/路径/资源名
比如:/index.html、/hello/index.jsp 、 /client/LoginServlet 等,只有在请求地址完全一样时才会调用Filter
目录匹配:/路径名/*
比如1:/abc/* 表示可以拦截abc目录下的所有资源,甚至是abc目录下的其他目录。
比如2:/* 表示只要访问项目根目录下的资源就会调用Filter
后缀名匹配:*.后缀名
比如:*.jsp 表示拦截所有后缀为jsp文件资源
第二种:通过filter-mapping中的servlet-name来指定要过滤的Servlet
在Filter的filter-mapping中增加了一个servlet-name标签,将该标签的值设置成Servlet的名字,在访问Servlet时就会调用该过滤器过滤请求。
<filter-mapping>
<filter-name>HelloFilter</filter-name>
<servlet-name>HelloServlet</servlet-name>
</filter-mapping>
Listener
Listener用于监听JavaWeb程序中的事件,当事件被触发时,监听器中的指定方法将会被调用。
监听对象的创建与销毁
ServletContextListener
作用:监听ServletContext对象的创建与销毁
方法:
public void contextInitialized ( ServletContextEvent sce ):ServletContext创建时调用
public void contextDestroyed ( ServletContextEvent sce ):ServletContext销毁时调用
ServletContextEvent对象
作用:public ServletContext getServletContext ():获取ServletContext对象
HttpSessionListener
作用:监听HttpSession对象的创建与销毁
方法:
public void sessionCreated ( HttpSessionEvent se ):HttpSession对象创建时调用
public void sessionDestroyed ( HttpSessionEvent se ):HttpSession对象销毁时调用
HttpSessionEvent对象
作用:public HttpSession getSession ():获取当前HttpSession对象
ServletRequestListener
作用:监听ServletRequest对象的创建与销毁
方法:
public void requestInitialized ( ServletRequestEvent sre ):ServletRequest对象创建时调用
public void requestDestroyed ( ServletRequestEvent sre ):ServletRequest对象销毁时调用
ServletRequestEvent对象
作用:
public ServletRequest getServletRequest ():获取当前的ServletRequest对象。
public ServletContext getServletContext ():获取当前项目的ServletContext对象。
三种创建与销毁的监听器使用起来基本一致。
在web.xml文件中注册监听器
<listener>
<listener-class>com.web.listener.MyServletContextListener</listener-class>
</listener>
监听对象的属性变化
ServletContextAttributeListener
作用:监听ServletContext中属性的创建、修改和销毁
方法:
public void attributeAdded(ServletContextAttributeEvent scab):向ServletContext中添加属性时调用
public void attributeRemoved(ServletContextAttributeEvent scab):从ServletContext中移除属性时调用
public void attributeReplaced(ServletContextAttributeEvent scab):当ServletContext中的属性被修改时调用
ServletContextAttributeEvent对象
作用:
public String getName() :获取修改或添加的属性名
public Object getValue():获取被修改或添加的属性值
public ServletContext getServletContext ():获取当前WEB应用的ServletContext对象
HttpSessionAttributeListener
作用:监听HttpSession中属性的创建、修改和销毁
方法:
public void attributeAdded ( HttpSessionBindingEvent se ):向HttpSession中添加属性时调用
public void attributeRemoved(HttpSessionBindingEvent se):从HttpSession中移除属性时调用
public void attributeReplaced(HttpSessionBindingEvent se):当HttpSession中的属性被修改时调用
HttpSessionBindingEvent对象
作用:
public String getName() :获取修改或添加的属性名
public Object getValue():获取被修改或添加的属性值
public HttpSession getSession ():获取当前的HttpSession对象
ServletRequestAttributeListener
作用:监听ServletRequest中属性的创建、修改和销毁
方法:
public void attributeAdded (ServletRequestAttributeEvent srae ):向ServletRequest中添加属性时调用
public void attributeRemoved(ServletRequestAttributeEvent srae):从ServletRequest中移除属性时调用
public void attributeReplaced(ServletRequestAttributeEvent srae):当ServletRequest中的属性被修改时调用
ServletRequestAttributeEvent对象
作用:
public String getName():获取修改或添加的属性名
public Object getValue():获取被修改或添加的属性值
public ServletRequest getServletRequest () :获取当前的ServletRequest对象
监听Session内的对象
HttpSessionBindingListener
作用:监听某个对象在session域中的创建与移除。
方法:
public void valueBound(HttpSessionBindingEvent event):该类的实例被放到Session域中时调用
public void valueUnbound(HttpSessionBindingEvent event):该类的实例从Session中移除时调用
HttpSessionBindingEvent对象
作用:
public HttpSession getSession ():获取HttpSession对象
public String getName():获取操作的属性名
public Object getValue():获取操作的属性值
使用:要监听哪一个类,直接使该类实现HttpSessionBindingListener接口即可。
HttpSessionActivationListener
作用:监听某个对象在session中的序列化与反序列化。
方法:
public void sessionWillPassivate(HttpSessionEvent se):该类实例和Session一起钝化到硬盘时调用
public void sessionDidActivate(HttpSessionEvent se):该类实例和Session一起活化到内存时调用
HttpSessionEvent对象
作用:
public HttpSession getSession ():获取HttpSession对象
使用:要监听哪一个类,直接使该类实现HttpSessionActivationListener接口即可。
注意:为被监听类对象可以正常序列化到硬盘上,还需要让该类实现java.io.Serializable接口
Web基础了解版10-Filter-Listener的更多相关文章
- Web基础了解版03-jQuery
jQuery jQuery,顾名思义,也就是JavaScript和查询(Query)极大地简化了JavaScript开发人员遍历HTML文档.操作DOM.处理事件.执行动画和开发Ajax. jQuer ...
- Web基础了解版04-XML-Tomcat-Http
XML 什么是XML - Tomcat - Http XML:eXtensible Markup Language (可扩展标记语言). XML 是一种标记语言,很类似 HTML. XML 的设计宗旨 ...
- Web基础了解版07-EL表达式-运算符-11个隐式对象
EL EL(Expression Language)是JSP内置的表达式语言,用以访问页面的上下文以及不同作用域中的对象 ,取得对象属性的值,或执行简单的运算或判断操作.EL在得到某个数据时,会自动进 ...
- Web基础了解版02-JavaScript
JavaScript 特性 ① 解释型语言.JavaScript是一种解释型的脚本语言,JavaScript是在程序的运行过程中逐行进行解释,不需要被编译为机器码再执行. ② 面向对象.JavaScr ...
- Web基础了解版05-Servlet
Servlet Servlet? 从广义上来讲,Servlet规范是Sun公司制定的一套技术标准,包含与Web应用相关的一系列接口,是Web应用实现方式的宏观解决方案.而具体的Servlet容器负责提 ...
- Web基础了解版06-Jsp
Jsp Jsp全称Java Server Pages,也就是在我们JavaWeb中的动态页面. Jsp能够以HTML页面的方式呈现数据,是一个可以嵌入Java代码的HTML. Jsp其本质就是一个Se ...
- Web基础了解版12-上传下载
上传 两个步骤: 用户在页面中选择要上传的文件,然后将请求提交到Servlet Servlet收到请求,解析用户上传的文件,然后将文件存储到服务器 上传文件表单 <form action=&qu ...
- Web基础了解版09-Cookie-Session
Cookie Cookie 是一种服务器发送给浏览器以键值对形式存储小量信息的技术. 当浏览器首次请求服务器时,服务器会将一条信息封装成一个Cookie发送给浏览器,浏览器收到Cookie,会将它保存 ...
- Web基础了解版01-html-css
HTML 网页构成 摘要 说明 结构(HTML) HTML是网页内容的载体.内容就是网页制作者放在页面上想要让用户浏览的信息,可以包含文字.图片.视频等. 表现(CSS) CSS样式是表现.就像网页的 ...
随机推荐
- poj 1655 Balancing Act 求树的重心【树形dp】
poj 1655 Balancing Act 题意:求树的重心且编号数最小 一棵树的重心是指一个结点u,去掉它后剩下的子树结点数最少. (图片来源: PatrickZhou 感谢博主) 看上面的图就好 ...
- VS开发ArcEngine时的一个异常信息——“ArcGIS version not specified. You must call RuntimeManager.Bind before creating any ArcGIS components.”
问题描述:程序报错“ArcGIS version not specified. You must call RuntimeManager.Bind before creating any ArcGIS ...
- python 操作asdl
#!/usr/bin/env python# -*- coding:utf-8 -*- import win32ras import time,os def Connect(dialname, acc ...
- 阿里云应用实时监控 ARMS 再升级,支持 Prometheus 开源生态
摘要: 应用实时监控服务 (ARMS) 是一款APM类的监控产品. 用户可基于 ARMS 的前端.应用.自定义监控,快速构建实时的应用性能和业务监控能力.ARMS 让所有性能问题“一屏了然”,不遗余力 ...
- iPhone:constrainedToSize获取字符串的宽高
在使用UILabel存放字符串时,经常需要获取label的长宽数据,本文列出了部分常用的计算方法. 1.获取宽度,获取字符串不折行单行显示时所需要的长度 CGSize titleSize = [aSt ...
- 学习meta标签http-equiv属性
meta标签http-equiv属性的使用:meta标签http-equiv属性的使用
- selenium webdriver学习(五)------------iframe的处理(转)
selenium webdriver学习(五)------------iframe的处理 博客分类: Selenium-webdriver 如何定位frame中元素 有时候我们在定位一个页面元素的时 ...
- SpringBoot-provider-JPA Not a managed type 问题分析及解决办法
spring boot jpa-java.lang.IllegalArgumentException: Not a managed type异常问题解决方法 JPA实体类没有被扫描到,导致这样的情况有 ...
- 什么是CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI?
https://mp.weixin.qq.com/s/Co1LxS2h_ILh9syOmshjZg 什么是CGI CGI全称是“公共网关接口”(Common Gateway Interface),HT ...
- canvas简单动画
实现场景:定义一个1000*800的方框,圆球在其中移动,碰撞到边框弹回的动画.方框背景是半径为10的小圆球组成.鼠标移动到移动圆球时,圆球停止运动. html代码: <div> < ...