1、什么是过滤器?
过滤器是在执行某个url前所需要做的事情,url可能是某个serlvet所对应的,也有可能是jsp页面 特点: 声明式的 动态的 灵活的 模块化的 可移植的 可重用的 透明的 用处: 统一的认证处理 对用户的请求做检查、做更精确的纪录 监视或对用户所传递的参数做前置处理,如防止数据隐藏码攻击 改变图像文件的格式 对响应做编码的动作 对响应做压缩处理 对XML的输出使用xslt来转换2、过滤器的写法 1)自定义类,实现javax.servlet.Filter接口 2)分别实现init(FilterConfig), doFilter(ServletRequest, ServletResponse, FilterChain) destroy() 3)在web.xml中配置该filter 告诉web容器存在这么一个filter,可以使用<init-param>配置filter的初始化参数,在Filter代码中用FilterConfig对象获取初始化参数告诉web容器此filter对哪个url进行过滤
准确地告诉filter该过滤哪个servlet 可以使用通配符过滤多个servlet
3、Filter的生命周期
*1)init(FilterConfig)初始化方法 在tomcat容器启动的时候就会对过滤器进行初始化 2)在执行其过滤的url时,先初始化该url所对应的serlvet *3)调用filter的doFilter()方法,进行过滤,使用chain.doFilter传递给下一个过滤器或servlet 4)执行下一个过滤器的doFilter方法,或者servlet的service方法 *5)在关闭web容器时,调用 destroy()销毁过滤器4、什么是FilterChain? FilterChain对象是过滤器链,可以由一个Filter传递到另外的一个Filter,或者直接传递到被过滤的servlet 如果下一个是过滤器,则传递给过滤器,执行下一个过滤器的doFilter; 如果下一个是servlet,则传递给servlet。执行此servlet的service方法 使用FilterChain对象的doFilter()方法进行过滤器链的传递 doFilter(ServletRequest, ServletResponse), 会把在这里修改的request和response传递给下一个过滤器或者Servlet 在chain.doFilter前执行的方法叫前置方法 在chain.doFilter后执行的方法叫后置方法 filter1执行前置方法,filter1的doFilter到filter2, filter2执行前置方法,filter2的doFilter到servlet, servlet执行service方法, 返回到filter2执行后置方法, 返回到filter1执行后置方法5、过滤器中的执行顺序 根据web.xml中配置的filter的顺序来执行,如果两个或多个filter最终都是过滤同一个servlet,则按照顺序从上往下执行每个filter6、ServletContextListener web上下文监听器 对部署在tomcat等web容器的应用的初始化和销毁进行监听 写自己的监听器实现javax.servlet.ServletContextListener接口1 contextInitialized(ServletContextEvent sce) // 当web应用初始化时调用 的方法2 contextDestroyed(ServletContextEvent sce) // 当tomcat等web容器关闭时调用的方法
使用情景:访问人数的初始化,web应用的全局配置
7、javax.servlet.ServletContextAttributeListener 对application(ServletContext) 对象中属性的添加,移除,更新的监听attributeAdded(ServletContextAttributeEvent scae) //添加属性时调用的方法attributeRemoved(ServletContextAttributeEvent scae) //移除属性时调用的方法attributeReplaced(ServletContextAttributeEvent scae) // 更新属性时调用的方法
scae.getName()可以获取到属性的名称
scae.getValue()获取到属性的值8、javax.servlet.http.HttpSessionListener接口 对session创建与销毁的监听 tomcat容器关闭时产不调用sessionDestroyed(HttpSessionEvent se); 是在session.invalidat()或者timeout 第一次访问的时候就会创建Session,则会调用sessionCreated(HttpSessionEvent se)。并不是说在request.getSession()时调用9、javax.servlet.http.HttpSessionAttributeListener 对session中属性的监听1 attributeAdded(HttpSessionBindingEvent se) //添加属性时调用的方法2 attributeRemoved(HttpSessionBindingEvent se) //移除属性时调用的方法3 attributeReplaced(HttpSessionBindingEvent se) //更新属性时调用的方法
10、javax.servlet.http.HttpSessionActivationListener
Activate与Passivate是用于置换对象的动作,当Session对象由于资源利用或负载平衡等原因而必须 暂时储存至硬盘或其它储存器上时(透过对象序列化),所作的动作称之为Passivate, 而硬盘或储存器上的Session对象重新加载JVM时所作的动作称之为Activate11、javax.servlet.http.HttpSessionBingingListener 实现了该接口的其他类的对象被添加到session的属性中时或从Session中移除,而调用的1 valueBound(HttpSessionBindingEvent event); 该类的对象被添加到session时调用2 valueUnbound(HttpSessionBindingEvent event); 该类的对象从session中移除时调用
12、javax.servlet.ServletRequestListener
监听request请求的初始化和销毁requestDestroyed(ServletRequestEvent sre) //请求销毁时调用requestInitialized(ServletRequestEvent src) //请求初始化时调用
13、javax.servlet.ServletRequestAttributeListener
当设置属性到request中,或从Request中移除,更新属性所调用的1 attributeAdded(ServletRequestAttributeEvent srae) 添加属性时调用的方法2 attributeRemoved(ServletRequestAttributeEvent srae) 移除属性时调用的方法3 attributeReplaced(ServletRequestAttributeEvent srae) 更新属性时调用的方法
14、事件对象
javax.servlet.ServletContextEvent getServletContext();javax.servlet.http.HttpSessionEvent getSission();javax.servlet.ServletRequestEvent getServletRequest();
15、java.util.Propertis类的使用
用于读取.properties文件,根据properties文件中指定的key值获取到对应的value值 参考WEB-INF目录下test.properties, ConfigUtil.java, PathUtil.java