Filter+Listener
8-31,星期四 8:52:31
Web三大组件
1. Servlet
2. Filter
3. Listener
Filter 过滤器
过滤请求
使用步骤:
Filter的使用方式与Servlet基本相同
1. 编写一个类 实现Filter
2. 在web.xml中 进行配置
代码实现
package cn.xdl.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* 过滤器
*
* 用来过滤请求
* @author j
*
*/
public class UserFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("过滤器正在初始化");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request2 = (HttpServletRequest) request;
HttpServletResponse response2 = (HttpServletResponse) response;
HttpSession session = request2.getSession();
if(session.getAttribute("userName")==null){
System.out.println("过滤器发现了一个不匹配的请求, 已经过滤掉, 且将其重定向到了登录页面");
session.setAttribute("loginFlag", "sada");
response2.sendRedirect("login.jsp");
return;
}
//放行
System.out.println("过滤器执行了放行操作");
chain.doFilter(request, response);
}
@Override
public void destroy() {
System.out.println("过滤器正在准备销毁");
}
}
web.xml配置案例
一个过滤器过滤多个页面
<filter>
<filter-name>userfilter</filter-name>
<filter-class>cn.xdl.filter.UserFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>userfilter</filter-name>
<url-pattern>/userInfo.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>userfilter</filter-name>
<url-pattern>/manager.jsp</url-pattern>
</filter-mapping>
Filter方法
1. 初始化方法 , 当tomcat运行时执行
public void init(FilterConfig filterConfig);
2. 执行过滤的方法 , 包含了请求对象与相应对象, 以及过滤器链的操作对象
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain);
3. 准备销毁时执行的方法, 在tomcat关闭时执行
public void destroy();
在过滤器链中 , 执行的顺序
1. 通过web.xml配置的Filter优先级较高!
2. web.xml配置越靠前 , 优先级越高
Listener监听器
Servlet规范中定义的一种特殊的组件,用来监听Servlet容器产生的事件并进行相应的处理
容器产生的事件分类
- 生命周期相关的事件
- 设置和删除Attribute数据相关的事件
ServletContextListener监听器
在ServletContext创建时和关闭时都会通知ServletContextListener
方法:
servletContextInitialized(ServletContextEvent sce)
当ServletContext创建的时候,将会调用这个方法
servletContextDestroyed(ServletContextEvent sce)
当ServletContext销毁的时候(例如关闭应用服务器或者重新加载应用),将会调用这个方法。
ServletContextAttributeListener监听器
当往Servlet Context添加、删除或者替换一个属性的时候,将会通知ServletContextAttributesListener
方法:
void attributeAdded(ServletContextAttributeEvent scab)
往ServletContext中加入一个属性的时候触发;
void attributeRemoved(ServletContextAttributeEvent scab)
从ServletContext中删除一个属性的时候触发;
void attributeReplaced(ServletContextAttributeEvent scab)
改变ServletContext中属性的时候触发。
HttpSessionListener监听器
当一个HttpSession刚被创建或者失效(invalidate)的时候,将会通知HttpSessionListener
方法:
void sessionCreated(HttpSessionEvent hse)
当一个HttpSession对象被创建时,将会调用这个方法;
void sessionDestroyed(HttpSessionEvent hse)
当一个HttpSession超时或者调用HttpSession的invalidate()方法让它销毁时,将会调用这个方法
HttpSessionAttributesListener监听器
HttpSession中添加、删除或者替换一个属性的时候,将会通知HttpSessionAttributesListener
方法:
void attributeAdded(HttpSessionBindingEvent e)
当往会话中加入一个属性的时候,将会调用这个方法;
void attributeRemoved(HttpSessionBindingEvent e)
当从会话中删除一个属性的时候,将会调用这个方法;
void attributeReplaced(HttpSessionBindingEvent e)
当改变会话中的属性的时候,将会调用这个方法
在web.xml中配置listener组件
<listener>
<listener-class>
cn.xdl.listener.MyListener
</listener-class>
</listener>