过滤器
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中移除");
}