拦截器、过滤器、监听器的区别

拦截器: 从字面意思来讲,他的功能就是进行拦截操作,Spring MVC中拦截器主要是通过 HandlerInterceptor来实现的,主要功能是拦截用户的 URL请求并进行相应的处理,比如说用来判断用户是否登录了,进行权限验证等。

实现拦截器的方式

  • 实现 HandlerInterceptor接口
  • 实现 WebRequestInterceptor接口

实现 HandlerInterceptor接口

public class Interceptor implements HandlerInterceptor {


    /*
    	该方法将在请求处理之前进行调用
    	在这个方法可以进行一些预处理,比如判断当前请求是否需要继续执行下去,当返回false时,将不会向下执行。在		返回值是true的情况下,如果有多个Interceptor,将会继续执行下一个preHandle()方法,若没有多个				Interceptor,将会执行请求相对应的Controller方法
    */
    @Override
    default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return true;
    }

    /*
    	执行的前提:preHandle()方法返回值为true
    	该方法在Controller方法执行后,但在DispatcherServlet (前端控制器)进行视图返回渲染之前执行(由			ViewResolver视图解析器进行解析并渲染工作),我们可以在这个方法中对返回的ModelAndView对象进行后续处理
    */
    @Override
    default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
    }
    /*
    	执行的前提:preHandle()方法返回值为true
    	该方法在进行视图渲染工作完成后执行,即整个请求结束后执行,主要进行收尾工作。
    */
    @Override
    default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
    }
}

实现 WebRequestInterceptor接口

三个方法的作用和执行顺序可参考上面 HandlerInterceptor的解释

public class Interceptor implements WebRequestInterceptor {


    public void preHandle(WebRequest request) throws Exception {
        
    }

    public void postHandle(WebRequest request, ModelMap model) throws Exception {

    }

    public void afterCompletion(WebRequest request, Exception ex) throws Exception {

    }
}

过滤器: 从字面意思来讲,它就是对请求进行一个过滤,它不能产生请求,也不能进行响应。但可以用来转换HTTP请求、响应和头信息。它可以修改对某一资源的请求,或者修改某一资源的响应。

创建一个Filter的步骤

  1. 创建Filter 处理类:

  2. web.xml 文件中配置Filter 。

// 用于完成Filter的初始化。
void init(FilterConfig config):
// 用于Filter 销毁前,完成某些资源的回收。
void destroy():  
// 实现过滤功能,该方法就是对每个请求及响应增加的额外处理。 
void doFilter(ServletRequest request, ServletResponse response,FilterChain chain): 

拦截器与过滤器的区别

  1. 拦截器是基于Java的反射机制的,而过滤器是基于函数回调
  2. 过滤器依赖与servlet容器,而拦截器不依赖与servlet容器
  3. 拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用
  4. 拦截器可以访问action上下文、值栈里的对象,而过滤器不能
  5. 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次

监听器: 它是实现了javax.servlet.ServletContextListener接口的服务器端程序,随着Web容器的启动而启动,只加载一次,主要作用是:做一些初始化的内容添加工作、设置一些基本的内容、就是spring容器启动的时候加载一些数据。

javax.servlet.ServletContextListener接口中定义了2种方法:

void contextInitialized(ServletContextEvent sce) 监听器的初始化

void contextDestroyed(ServletContextEvent sce) 监听器销毁

	/*
     * 当容器启动完成之后
     */
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        // TODO Auto-generated method stub
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        // TODO Auto-generated method stub

    }

详细解释可参考:过滤器,拦截器,监听器的区别 - Rooker - 博客园 (cnblogs.com)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值