一. 监听器
6种需要在web.xml注册其实现类的监听器接口
(1) ServletContextListener 监听application创建销毁事件
(2) HttpSessionListener 监听session创建销毁事件
(3) ServletRequestListener 监听request创建销毁事件
(4) ServletContextAttributeListener 监听application属性变化事件
(5) HttpSessionAttributeListener 监听session属性变化事件
(6) ServletRequestAttributeListener 监听request属性变化事件
<!-- 在web.xml中注册 -->
<listener>
<listener-class>
frame.project.listener.ApplicationListener
</listener-class>
</listener>
2种需要在实体类中实现的监听器接口
(1) HttpSessionBindingListener 监听实体类在session中被绑定解绑事件
(2) HttpSessionActivationListener 监听实体类随session被序列化反序列化事件
二. 过滤器
//实现javax.servlet.Filter接口
public class MyFilter implements Filter{
String param;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
param = filterConfig.getInitParameter("参数名");
System.out.println("过滤器初始化");
}
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
if(param.equals("参数值")) {
chain.doFilter(req, res);
} else {
request.getRequestDispatcher("/error.jsp").forward(request, response);
}
}
@Override
public void destroy() {
System.out.println("过滤器销毁");
}
}
<!-- 在web.xml中注册 -->
<filter>
<filter-name>myFilter</filter-name>
<filter-class>frame.project.filter.MyFilter</filter-class>
<init-param>
<param-name>参数名</param-name>
<param-value>参数值</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
三. 拦截器
//spring mvc方式:继承HandlerInterceptorAdapter类
public class RequestInterceptor extends HandlerInterceptorAdapter{
/**
* 在control之前执行
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object object)
throws Exception {
System.out.println("预处理");
HandlerMethod handler = (HandlerMethod) object;
if(true) {
return true;
} else {
request.getRequestDispatcher("/error.jsp").forward(request, response);
return false;
}
}
/**
* 在control之后,渲染页面之前执行
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("后处理");
}
/**
* 拦截器抛出异常或请求完成后执行
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("待测试");
}
@Override
public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("待测试");
}
}
<!-- 在springMvc.xml中配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" /> <!-- 拦截的路径 -->
<mvc:exclude-mapping path="/login"/> <!-- 跳过拦截的路径 -->
<bean class="frame.project.interceptor.RequestInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
四. 监听器,过滤器,拦截器区别
1.监听器:监听request,session,application对象的创建销毁,属性改变等事件,触发执行代码
2. 过滤器和拦截器区别:
(1) 拦截器是基于java反射机制来实现的,而过滤器是基于函数回调来实现的。
(2) 拦截器不依赖servlet容器,过滤器依赖于servlet容器。
(3) 拦截器只对Action起作用,过滤器可以对所有请求起作用。
(4) 拦截器可以访问Action上下文和值栈中的对象,过滤器不能。
(5) 在Action的生命周期中,拦截器可以多次调用,而过滤器只能在容器初始化时调用一次。