一、Filter——过滤器
1.什么是Filter
1) Filter (过滤器) 的基本功能是对Servlet 容器调用Servlet (JSP)的过程进行拦截,从而在Servlet处理请求前和Servlet响应 请求后实现一些特殊的功能。
2)在Servlet API 中定义了三个接口类来开供开发人员编写Filter 程序: Filter,FilterChain, FilterConfig
3) Filter 程序是一个实现了Filter 接口的Java类,与Servlet 程序相似,它由Servlet 容器进行调用和执行
4) Filter 程序需要在web.xml 文件中进行注册和设置它所能拦截的资源: Filter 程序可以拦截Jsp, Servlet,静态图片文件和静 态html 文件
2.Filter的工作原理
1)当在web.xml 中注册了一个Filter 来对某个Servlet 程序进行拦截处理时,这个Filter就成了Tomcat 与该Servlet 程序的 通信线路上的一道关卡,该Filter 可以对Servlet容器发送给Servlet 程序的请求和Servlet 程序回送给Servlet 容器的响应 进行拦截,可以决定是否将请求继续传递给Servlet 程序,以及对请求和相应信息是否进行修改。
2)在一个web应用程序中可以注册多个Filter 程序,每个Filter 程序都可以对一个或一组Servlet 程序进行拦截。
3)若有多个Filter 程序对某个Servlet 程序的访问过程进行拦截,当针对该Servlet 的访问请求到达时,web容器将把这多 个Filter程序组台成-一个Filter链(过滤器链)。Filter链中各个Filter 的拦截顺序与它们在应用程序的web.xml 中映射的顺 序一致
4)放行请求只需要执行filterChain的dofilter方法
doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
在doFilter执行之前,由容器将filterChain对象传入方法。调用此对象的.doFilter()方法可以将请求放行,实际上是执行 过滤器链中的下一个doFilter方法,但是如果只有一个过滤器,则为放行。
3.编写Filter的步骤
1)创建Filter实现类,实现Filter接口
2)在web.xml文件中配置Filter的信息
<filter>
<filter-name> MyFirstFilter </filter-name>
<filter-class> com.hbnu.filter <filter-class>
</filter>
<filter-mapping>
<filter-name> MyFirstFilter </filter-name>
<url-pattern> /index.jsp </url-pattern>
</filter-mapping>
4.Filter的生命周期
1)在服务器启动时,filter 被创建并初始化,执行init()方法。
2)请求通过filter时执行doFilter 方法。
3)服务器停止时,调用destroy方法。
5.url-pattern
url-pattern是配置filter 过滤哪些请求的。主要有以下几种配置:
web.xml中配置的/都是以当前项目路径为根路径的
1)精确匹配:
/index.jsp/user/login
会在请求/index.jsp、/user/login 的时候执行过滤方法
2)路径匹配:
/user/* /*
凡是路径为/user/下的所有请求都会被拦截,/*表示拦截系统的所有请求,包括静态资源文件。
3)扩展匹配:
*. jsp *.action
凡是后缀名为.jsp .action 的请求都会被拦截。
注意: /login/*.jsp 这种写法是错误的,只能是上述三种的任意一种形式。 不能组合新形式。
二、Listener——监听器
1.什么是Listener
专门用来对其他对象身_上发生的事情或状态改变进行监听和相应处理的对象,当被监视对象发生情况时,立即采取相 应的行动
作用:监听web变化:Servlet规范中定义的一种特殊类,用于监听web'应用程序中的ServletContext,HttpSession, ServletRequest 等域对象的创建与销毁,以及属性变化
2.八大Listener
1)ServletContextListener
ServletContext生命周期监听器,创建和销毁时被触发。包含两个方法:
contextlnitialized(ServletContextEvent): ServletContext 创建事件监听
contextDestroyed(ServletContextEvent): ServletContext 销毁事件监听
2)ServletContextAttributeListener
ServletContext属性监听器,发生属性变化时触发。
attributeAdded(ServletContexttributeEvent):增加属性时调用;
attributeRemoved(ServletContextAttributeEvent):移除属性时调用
attributeReplaced(ServletContexttributeEvent):属性替换时调用
3)HttpSessionListener
HttpSession生命周期监听器,创建和销毁session时被触发。
sessionCreated(HttpSessionEvent): session 创建时触发
sessionDestroyed(HttpSessionEvent): session 销毁时触发,invalid, session 过期。
4)HttpSessionAttributeListener
HttpSession属性监听器,session 中属性变化时触发
attributeAdded(HttpSessionBindingEvent):属性添加时调用
attributeRemoved(HttpSessionBindingEvent):属性移除时调用
attributeReplaced(HttpSessionBindingEvent):属性替换时使用
5)HttpSessionActivationListener
HttpSession活化与钝化监听,不需要在web.xml中配置,必须是类实现此接口
sessionWillPassivate(HttpSessionEvent):某个类和session一起钝化时调用
sessionDidActivate(HttpSessionEvent):某个类和session一起活化时调用
6)HttpSessionBindingListener
HttpSession属性绑定时调用,不需要在web.xml中配置,必须是类实现此接口。当此类被当做属性值绑定到session中 时触发
valueBound(HttpSessionBindingEvent):属性被设置到session域中时触发
valueUnbound(HttpSessionBindingEvent):属性从session域中移除时触发
7)ServletRequestListener
ServletRequest生命周期监听器。ServletRequest 创建和销毁时触发
requestlnitialized(ServletRequestEvent):请求初始化时触发
requestDestroyed(ServletRequestEvent):请求完成时触发
8)ServletRequestAttributeListener
ServletRequest属性监听器。ServletRequest 中属性变化时触发
attributeAdded(ServletRequestAttributeEvent): request 中增加属性调用
attributeRemoved(ServletRequestAttributeEvent): request 中移除属性调用
attributeReplaced(ServletRequestAttributeEvent): request 中属性替换调用
ServletContextListener、HttpSessionListener、ServletRequestListener属于生命周期监听类
ServletContextAttributeListener、HttpSessionAttributeListener、 ServletRequestAttributel istener属于属性监听类
HttpSessionActivationListener、HttpSessionBindingListener 属于特殊监听类
3.Listener的使用
1)生命周期、属性监听器:
- 创建相应的实现类
- 配置web.xml
<listener>
<listener-class> com.hbnu.MyFirstListener </listener-class>
</listener>