过滤器、监听器和拦截器的使用
一、过滤器、监听器和拦截器总览
过滤器(Filter) | 监听器(Listener) | 拦截器(Interceptor) | |
---|---|---|---|
关注点 | web请求 | 系统级别参数、对象 | Action(部分web请求) |
如何实现 | 函数回调 | 事件 | Java反射机制(动态代理) |
应用场景 | 设置字符编码、URL级别的权限访问控制、过滤敏感词汇、压缩响应信息 | 统计网站在线人数、清除过期session | 拦截未登录用户、审计日志 |
是否依赖servlet容器 | 依赖 | 不依赖 | |
servlet提供的支持 | Filter接口 | ServletContextListerner抽象接口、HttpSessionListener抽象接口 | Action(部分web请求)、HandlerinterceptorAdapter类 |
Spring提供的支持 | HandlerInterceptor接口 | ||
级别 | 系统级 | 系统级 | 非系统级 |
二、过滤器、监听器和拦截器详解
拦截器(interceptor)
- 拦截器是一种面向方面/切面编程(AOP Aspect-Oriented Programming).
- 面向切面就是将多个模块的的通用服务进行分离,如权限管理、日志服务,他们在多个模块中都会用到,就可以将其各自封装为一个可重用模块。而这些通用服务的具体实现是通过拦截器来完成,比如用户客户端访问一些保密模块都应先通过权限审查的拦截器来进行权限审查,确定用户是否具有该项操作的权限后方能向下执行。
package org.springframework.web.servlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.lang.Nullable;
import org.springframework.web.servlet.ModelAndView;
public interface HandlerInterceptor {
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;
}
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
}
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
}
}
过滤器(filter)
- 过滤器处于客户端与Web资源(Servlet、JSP、HTML)之间,客户端与Web资源之间的请求和响应都要通过过滤器进行过滤。举例:在过滤器中定义了禁止访问192.10.10.1这个地址,那么当客户端发出访问192.10.10.1的请求时,经过过滤器后,客户端得到的响应是出现该IP禁止访问的提示。
- 在java web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的 action进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉)。
public class MyFilter implements Filter {
/**
* 初始化
* @param filterConfig
* @throws ServletException
*/
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
/**
* 过滤器拦截
* @param servletRequest
* @param servletResponse
* @param filterChain
* @throws IOException
* @throws ServletException
*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
}
/**
* 销毁
*/
@Override
public void destroy() {
}
}
过滤器和拦截器的区别
- 拦截器是基于java反射机制的,而过滤器是基于函数回调。
- 拦截器不依赖于Servlet容器,而过滤器依赖于servlet容器。
- 拦截器只能对action请求起作用,而过滤器可以对几乎所以的请求起作用。
- 拦截器可以访问action上下文,值栈里的对象,而过滤器不能。
- 在Action的生命周期周,拦截器可以被多次调用,而过滤器只能在容器初始化的时候被调用一次。
**执行顺序 :**过滤前 - 拦截前 - Action处理 - 拦截后 - 过滤后。
**过滤器:**是在java web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的 action进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者 struts的action前统一设置字符集,或者去除掉一些非法字符.
**拦截器 :**是在面向切面编程的就是在你的service或者一个方法前调用一个方法,或者在方法后调用一个方法比如动态代理就是拦截器的简单实现,在你调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在你调用方法后打印出字符串,甚至在你抛出异常的时候做业务逻辑的操作。
listener监听器
JavaWeb中的监听器是Servlet规范中定义的一种特殊类,它用于监听web应用程序中的ServletContext, HttpSession和 ServletRequest等域对象的创建与销毁事件,以及监听这些域对象中的属性发生修改的事件。
监听ServletContext对象的创建和销毁?实现:ServletContextListener 接口,根据要求重写创建和销毁的方法。
package java.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
/**
* 监听ServletContent对象的创建和销毁
*/
public class MyServletContextListener implements ServletContextListener {
/**
* 对象创建
* @param sce
*/
public void contextInitialized(ServletContextEvent sce) {
}
/**
* 对象销毁
* @param sce
*/
public void contextDestroyed(ServletContextEvent sce) {
}
}
Java Web开发中的监听器(listener)就是由application、session、request三个对象创建、销毁或者往其中添加、修改、删除属性时自动执行代码的功能组件
- ServletContextListener:对Servlet上下文的创建和销毁进行监听。
- ServletContextAttributeListener:监听Servlet上下文属性的添加、删除和修改。
- HttpSessionListener:对Session的创建和销毁进行监听。
- HttpSessionAttributeListener:对Session对象中属性的添加、删除和修改进行监听。
- HttpSessionBindingListener:监听Http会话中对象的绑定信息。
- HttpSessionActivationListener:监听器监听Http会话的情况。
- ServletRequestListener:对请求对象的初始化和销毁进行监听。
- ServletRequestAttributeListener:对请求对象属性的添加、删除和修改进行监听。
监听对象 | 监听接口 | 监听事件 |
---|---|---|
ServletRequest | ServletRequestListener | ServletRequestEvent |
ServletRequestAttributeListener | ServletRequestAttributeEvent | |
HttpSession | HttpSessionListener | HttpSessionEvent |
HttpSessionActivationListener | ||
HttpSessionAttributeListener | HttpSessionBindingEvent | |
HttpSessionBindingListener | ||
ServletContext | ServletContextListener | ServletContextEvent |
ServletContextAttributeListener | ServletContextAttributeEvent |