开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天,点击查看活动详情
过滤器和监听器
Filter
1.概述
-
Filter称为过滤器,位于客户端与处理程序之间,能够对请求和响应进行检查和修改
-
当客户端对服务器资源发送请求时,服务器根据过滤规则进行检查,如果满足过滤规则,则对客户请求进行拦截,然后对请求头或请求数据进行修改或检查,并依次通过Filter链,最后将请求交给处理程序
-
请求信息可以在过滤器中被修改,也可以根据请求条件不让请求发往处理程序
-
拦截过程
2.Filter接口
-
编写一个Filter必须实现Filter接口
-
相关方法
方法名 说明 default void init(FilterConfig filterConfig) 创建Filter后用于初始化Filter,通过参数FilterConfig对象获取配置参数 void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) 用于完成过滤的操作,其中Request对象和Response对象是由上一个过滤器或者Web服务器传递过来的请求和响应对象,FilterChain对象代表当前过滤链对象 default void destroy() 用于释放过滤器中占用的资源,在对象被销毁之前调用 - Filter接口提供了三个方法,其中init()方法和destroy()方法是默认方法不强制重写,而doFilter()方法是抽象方法,在实现Filter接口时必须重写
3.Filter配置
-
配置Filter有两种方式,一种是通过web.xml文件进行配置,一种是通过@WebFilter注解进行配置
-
web.xml配置方式
<!--在web.xml文件的web-app标签下写入以下内容--> <filter> <filter-name>FilterDemo</filter-name> <filter-class>com.liaoxiangqian.filter.FilterDemo</filter-class> </filter> <filter-mapping> <filter-name>FilterDemo</filter-name> <url-pattern>/ServletDemo</url-pattern> </filter-mapping>
-
@WebFilter注解配置方式
@WebFilter("/ServletDemo") public class FilterDemo implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("FilterDemo执行了"); } }
@WebFilter常用属性
属性名 类型 说明 filterName String 指定过滤器名称 urlPattren String[] 指定需要过滤的资源,如某个Servlet或Jsp value String[] 等价于urlPattern,不能同时使用 servletNames String[] 指定过滤器将应用于哪些Servlet,取值是@WebServlet中name属性的取值 dispatcherTypes DispatcherType 指定过滤器转发模式,取值有ERROR、FORWARD、INCLUDE、REQUEST initParams WebInitParam[] 指定过滤器的一组初始化参数 -
注意
- DispatcherType是枚举类,取值的作用如下:
- DispatcherType.ERROR表示过滤器拦截那些跳转到某个异常处理页面的请求
- DispatcherType.FORWARD表示过滤器拦截那些通过forward()方法来请求的转发的请求
- DispatcherType.INCLUDE表示过滤器拦截那些通过include()方法来请求包含的请求
- DispatcherType.REQUEST表示过滤器只会拦截普通的请求,而请求转发和请求包含类的请求不会拦截
-
如果需要拦截用户的所有请求,则可以使用*号通配符,如
<url-pattern>/*</url-pattern>
@WebFilter("/*")
-
4.FilterConfig接口
-
FilterConfig接口用于封装Filter的配置信息,在Filter初始化时,服务器将FilterConfig对象作为参数传递给Filter对象的init()方法
-
FilterConfig相关方法
方法名 说明 String getFilterName() 获取Filter的名称 ServletContent getServletContext() 获取ServletContext对象 String getInitParameter(String name) 根据名称获取初始化参数值 Enumeration getInitParameterNames() 返回一个包含所有初始化参数名的Enumeration对象 -
配置初始化参数的方式
-
在web.xml中配置,注意是在标签下方进行配置
<init-param> <param-name>username</param-name> <param-value>liaoxiangqian</param-value> </init-param>
-
在@WebFilter中使用initParams属性配置
@WebFilter(initParams = {@WebInitParam(name="username",value="liaoxiangqian")})
注意initParams属性类型是注解型数组
-
-
添加初始化的参数后可以通过FilterConfig来获取这些参数
5.FilterChain接口
-
FilterChain对象表示当前过滤器所在的过滤链
-
一个Web应用程序中存在多个Filter,每个Filter都可以对某个请求进行拦截,如果多个Filter都对同一个请求进行拦截,那么这些Filter就组成一个Filter链,使用FilterChain对象表示
-
一个方法
void doFilter(ServletRequest var1, ServletResponse var2)
FilterChain提供的doFilter()方法,作用是让Filter链上的当前过滤器放行,使请求进入下一个Filter
6.Filter生命周期
- Filter生命周期可以分为创建、执行、销毁三个阶段
- 创建阶段:Web服务器启动的时候会创建Filter对象,并调用init()方法,完成对象的初始化,在一次完整请求中Filter对象只会被创建一次,init()方法只会被调用一次
- 执行阶段:客户端发出请求时,服务器筛选出符合拦截条件的过滤器,按照类名的顺序依次执行doFilter()方法,doFilter()在一次完整请求中会执行多次
- 销毁阶段:服务器关闭时,Web服务器调用destroy()方法销毁对象
Listener
1.概述
-
Web程序开发中,可以对对象的创建和销毁、域对象中属性的变化、会话相关内容进行监听
-
Servlet中提供八个监听器,都是以接口的形式提供,具体功能需要自行完善
-
相关概念
- 事件:触发的动作
- 事件源:产生事件的对象
- 事件监听器:监听发生在事件源上的事件
- 事件处理器:监听器的成员方法,事件发生时会触发该方法
2.监听对象的创建和销毁的监听器
-
ServletContextListener接口
-
用于监听ServletContext对象的创建与销毁
-
核心方法
方法 说明 void contextInitialized(ServletContextEvent sce) ServletContext对象创建时执行 void contextDestroyed(ServletContextEvent sce) ServletContext对象销毁时执行
-
-
HttpSessionListener接口
-
用于监听HttpSession对象的创建与销毁
-
核心方法
方法 说明 void sessionCreated(HttpSessionEvent se) HttpSession对象创建时执行 void sessionDestroy(HttpSessionEvent se) HttpSession对象销毁时执行
-
-
ServletRequestListener接口
-
用于监听ServletRequest对象的创建与销毁
-
核心方法
方法 说明 void requestInitialized(ServletRequestEvent sre) ServletRequest对象创建时执行 void requestDestroyed(ServletRequestEvent sre) ServletRequest对象销毁时执行
-
3.监听域对象属性变化的监听器
-
ServletContextAttributeListener接口
-
用于监听ServletContext中属性的变化
-
核心方法
方法 说明 void attributeAdded(ServletContextAttributeEvent scae) 域中添加属性时执行 void attributeRemoved(ServletContextAttributeEvent scae) 域中移除属性时执行 void attributeReplaced(ServletContextAttributeEvent scae) 域中替换属性时执行
-
-
HttpSessionAttributeListener接口
-
用于监听HttpSession中属性的变化
-
核心方法
方法 说明 void attributeAdded(HttpSessionBindingEvent se) 域中添加属性时执行 void attributeRemoved(HttpSessionBindingEvent se) 域中移除属性时执行 void attributeReplaced(HttpSessionBindingEvent se) 域中替换属性时执行
-
-
ServletRequestAttributeListener接口
-
用于监听ServletRequest中属性的变化
-
核心方法
方法 说明 void attributeAdded(ServletRequestAttributeEvent srae) 域中添加属性时执行 void attributeRemoved(ServletRequestAttributeEvent srae) 域中移除属性时执行 void attributeReplaced(ServletRequestAttributeEvent srae) 域中替换属性时执行
-
4.监听会话相关的感知型监听器
-
HttpSessionBindingListener接口
-
用于监听JavaBean对象绑定到HttpSession对像和从HttpSession对象解绑的事件
-
核心方法
方法 说明 void valueBound(HttpSessionBindingEvent event) 数据绑定(添加)到会话域时执行 void valueUnbound(HttpSessionBindingEvent event) 数据从会话域解绑(移除)时执行
-
-
HttpSessionActivationListener接口
-
用于监听HttpSession中对象活化(恢复到内存)和钝化(持久化到硬盘)的过程
-
核心方法
方法 说明 void sessionWillPassivate(HttpSessionEvent se) 会话域中数据钝化时执行 void sessionDidActivate(HttpSessionEvent se) 会话域中数据活化时执行
-
5.监听器的实现
-
步骤
- 将监听器绑定到事件源,也就是注册监听器
- 监听器监听到事件发生时,将事件对象作为参数传给相关的成员方法
- 成员方法可以根据事件对象获取事件源,然后进行处理
-
注册监听器的方式有两种,一种是通过web.xml文件,一种是通过注解的方式
-
通过web.xml注册
<!--<listener-class>标签中写的是监听器的实现类的全限定名类名--> <listener> <listener-class>com.liaoxiangqian.listener.MyListener</listener-class> </listener>
-
通过注解注册
//在监听器实现类上方使用该注解进行注册 @WebListener
-