过滤器
1、什么是过滤器?
原理:拦截 检查 放行,其实就是对资源的一种筛选,过滤
2、过滤器的创建过程
实现一个接口:Filter
重写三个方法 init doFilter destroy
在web.xml中配置过滤器
<filter> <filter-name>配置名字</filter-name> <filter-class>Filter类全名</filter-class> </filter> <filter-mapping> <filter-name>配置名字</filter-name> <url-pattern>过滤路径</url-pattern> </filter-mapping>
3、过滤器的生命周期
过滤器对象创建时,执行init方法一次,反复执行doFilter方法,Filter对象销毁时,执行destroy方法一次。
过滤器什么时候创建?什么时候销毁?
服务器启动时创建,服务器关闭时销毁。
4、Filter中的方法
public void init(FilterConfig arg0)
init方法是,Filter对象创建时执行的方法。
该方法的参数 FilterConfig 作用:
String getFilterName() 获取Filter 的name
String getInitParameter(String name) 获取初始化参数
Enumeration getInitParameterNames() 获取初始化参数的名字
ServletContext getServletContext() 获取ServletContext
public void doFilter(ServletRequest arg0, ServletResponse arg1,FilterChain arg2)
doFilter方法是在访问过滤时,反复执行的方法。(起到拦截和放行的作用)
该方法的参数 FilterChain 用来做过滤的放行工作。(所谓放行是指拦截后,进入要请求的资源)
arg2.doFilter(arg0,arg1);放行
public void destroy() {
System.out.println("TestFilter...destroy...");
}//过滤器销毁时调用的方法
5、过滤器的执行流程
单个过滤器
多个过滤器---责任链模式
6、过滤器配置文件 注解模式@webFilter("过滤的路径")
<filter-mapping> <filter-name>TestFilter</filter-name> <url-pattern>过滤的路径</url-pattern> <dispatcher> ---> 配置过滤器的过滤方式 REQUEST 默认 拦截请求 FORWARD 拦截转发(只拦截转发) INCLUDE 拦截包含 ERROR 拦截错误页面 </dispatcher> </filter-mapping>
7、过滤的路径
1 /具体路径 /TestServlet 只有访问TestServlet才会经过这个过滤器
2 /* 过滤所有请求
3 *.do 过滤所有结尾是 .do的请求
8、有很多路径需要过滤时
将这些文件统一放入一个文件夹,如aaa 这时过滤路径写 /aaa/* 就可以了
监听器
1、监听器是一个对象,用来监听另一个对象的变化。
2、web监听器(3类,8个)
Listener 是JavaEE 中Servlet规范下的一个组件
用来监听ServletRequest HttpSession ServletContext这个三个域对象。
3、监听器在web.xml中的配置
<listener> <listener-class>路径</listener-class> </listener>
4、第一类:监听域对象的生命周期
ServletContextListener,监听ServletContext的生命周期
public class MyServletContextListener implements ServletContextListener { /* * 监听ServletContext的生命周期(创建和销毁) * */ public void contextInitialized(ServletContextEvent arg0) { //ServletContext创建时调用的方法 System.out.println("ServletContext 创建了...."); } public void contextDestroyed(ServletContextEvent arg0) { //ServletContext销毁时调用的方法 System.out.println("ServletContext 销毁了...."); } }
HttpSessionListener,监听Session的生命周期
public class MySessionListener implements HttpSessionListener { public void sessionCreated(HttpSessionEvent arg0) { //arg0.getSession(); 获取事件源 System.out.println("Session创建了<<<<<"); } public void sessionDestroyed(HttpSessionEvent arg0) { System.out.println("Session销毁<<<<<"); } }
ServletRequestListener
public class MyRequestListener implements ServletRequestListener { public void requestInitialized(ServletRequestEvent arg0) { System.out.println("request创建了###"); } public void requestDestroyed(ServletRequestEvent arg0) { System.out.println("request销毁了###"); } }
4、第二类:监听值的变化
ServletContextAttributeListener
public class MyScAttrListener implements ServletContextAttributeListener { public void attributeAdded(ServletContextAttributeEvent arg0) { System.out.println("向SC中添加了一个值..."); } public void attributeRemoved(ServletContextAttributeEvent arg0) { System.out.println("从SC中移除一个值<<<"); } public void attributeReplaced(ServletContextAttributeEvent arg0) { System.out.println("替换了SC中的一个值###"); } }
HttpSessionAttributeListener
public class MySessionAttrListener implements HttpSessionAttributeListener { public void attributeAdded(HttpSessionBindingEvent arg0) { System.out.println("向Session中添加了一个值"); } public void attributeRemoved(HttpSessionBindingEvent arg0) { System.out.println("从Session中移除一个值"); } public void attributeReplaced(HttpSessionBindingEvent arg0) { System.out.println("替换Session中的值"); } }
ServletRequestAttributeListener
public class MyRequestAttributeListener implements ServletRequestAttributeListener { public void attributeAdded(ServletRequestAttributeEvent arg0) { System.out.println("request添加"); } public void attributeRemoved(ServletRequestAttributeEvent arg0) { System.out.println("request移除"); } public void attributeReplaced(ServletRequestAttributeEvent arg0) { System.out.println("request替换"); } }
5、第三类:监听JavaBean中的对象,部需要配置
在bean包的类中加上
public void valueBound(HttpSessionBindingEvent arg0) { System.out.println("对象绑定到了Session中"); } public void valueUnbound(HttpSessionBindingEvent arg0) { System.out.println("对象从Session中移除"); }