过滤器
什么是过滤器?
过滤器是servlet2.3规范中定义的一种小型的、可插入的Web组件。用来拦截Servlet容器的请求和响应过程。以便查看、提取或以某种方式操作正在客户机和服务器之间交换的数据。
过滤器通常是封装了一些功能的Web组件,这些功能很重要,但对于处理客户端请求或发送响应来说不是决定性的。
典型的应用包括记录请求和响应的数据、管理会话属性等。
如何编写过滤器?
1.编写一个java类,实现Filter接口;
-- 过滤器API中有3个常用的接口,位于javax,Servlet包中:Filter,FilterChain,FilterConfig
编程中,过滤器类要实现Filter接口,该接口中包含三个必须实现的方法:
void init(FilterConfig filterConfig);
void doFilter(ServletRequest request,ServletResponse response,FilterChain chain);
void destroy();
2.在doFilter方法中实现拦截处理逻辑;
-- public class CommentFilter implements Filter{
//创建实例后,调用init方法,该方法只执行一次
public void init(FilterConfig filterConfig) throws ServletException{ //.....}
//容器调用doFilter方法处理请求
public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) throws IOException,ServletException{ //...... chian.doFilter(request,response);}
//容器删除过滤器实例之前调用该方法,该方法只执行一次
public void destroy(){... ...}
}
3.将过滤器添加到Web程序中;
-- 修改web.xml文件,增加过滤器节点
<filter>
<filter-name>filter1</filter-name>
<filter-class>web.xxxServlet</filter-class>
</filter>
<filter-mapping>
<filter-name>filter1</filter-name>
<url-pattern>/xxx</url-pattern>
<filter-mapping>
4.把过滤器和Web应用一起打包部署。
-- 与web应用程序一起部署过滤器时,只需要把过滤器类和其他web组件类包括在一起,把web.xml文件(连同过滤器注册)放进web应用程序结构中,Servlet容器将处理之后的其他所有事情。
过滤器的优先级
如果有多个过滤器都满足过滤的条件,则容器依据<filter-mapping>的先后顺序来调用各个过滤器。
<filter>.......</filter>
<filter>.......</filter>
<filter-mapping>......</filter-mapping>
<filter-mapping>......</filter-mapping>
过滤器的初始化参数
容器启动之后,会创建过滤器实例
接下来,容器会调用过滤器的init方法,而容器会事先创建FilterConfig对象。该对象可以访问在web.xml文件中配置的一些参数。
这些在web.xml文件中存储,由FilterConfig对象读取,在执行init方法时能够访问的参数值,叫初始化参数。
通过这些初始化参数可以方便快捷的配置及修改一些辅助参数。
其中初始化参数的配置示例为:
<filter>
<filter-name>filter1</filter-name>
<filter-class>web.xxxFilter</filter-class>
<! -- 初始化参数 -- >
<init-param>
<param-name>illegaIStr</param-name>
<param-value>xxx</param-value>
</init-param>
</filter>
读取初始化参数
使用FilterConfig对象可以读取在web.xml中配置的初始化参数。示例:
String config.getInitParamter("illegalStr")
过滤器的优点:
实现代码的“可插拔性”,即增加或减少某个功能模块,不会影响程序的正常执行;
可以将多个相同处理逻辑的模块集中写在过滤器里面,方便代码的维护。
监听器
什么是监听器?
Servlet规范中定义的一种特殊的组件,用来监听Servlet容器产生的事件并进行相应的处理。
容器产生的两大类事件:
--生命周期相关的事件
容器创建或者销毁request,session,ServletContext时产生的事件
--绑定数据相关的事件
调用了request,session,ServletContext的setAttribute,removeAttribute方法时产生的事件
如何编写监听器?
1.编写一个java类,依据监听的事件类型选择实现相应的监听器接口。例如要监听Session对象的创建和销毁,要实现HttpSessionListener
--public class CouListener implements HttpSessionListener{ // 实现方法}
2.在监听器接口方法中,实现相应的监听处理逻辑
--public class CouListener implements HttpSessionListener{
public void sessionCreate(HttpSessionEvent arg0){
//......
HttpSession session = arg0.getSession();
ServletContext ctx = session.getServletContext();(获取session或上下文对象的方法)
}
}
3.在web.xml文件中注册该监听器
--在web.xml文件中,增加以下节点:
<! -- 监听器 -->
<listener>
<listener-class>web.CouListener</listener-class>
</listener>
<!-- 实现相同的listener接口的多个监听器,在执行时是按web.xml注册出现的顺序决定 -->
应用场景:
由于ServletRequest,HttpSession,ServletContext对象都是容器创建的,通过对这些对象注册监听器,就可以得知何时创建了。例如:
在contextDestroy方法中对应用级别的资源进行释放;
统计在线人数可以通过HttpSessionListener监听器的sessionCreated方法监听session的创建动作。
未完,暂时总结这些。