`
如若_晴
  • 浏览: 111697 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Java过滤器与SpringMVC拦截器之间的关系与区别

阅读更多
转载自:http://blog.csdn.net/chenleixing/article/details/44573495

今天学习和认识了一下,过滤器和SpringMVC的拦截器的区别,学到了不少的东西,以前一直以为拦截器就是过滤器实现的,现在想想还真是一种错误啊,而且看的比较粗浅,没有一个全局而又细致的认识,由于已至深夜,时间原因,我就把一些网友的观点重点摘录下来,大家仔细看后也一定会有一个比较新的认识(在此非常感谢那些大牛们的无私奉献,分享他们的经验与心得,才能让像我这样的小白有机会站一下你们这些巨人的肩膀,才能少走些弯路)。

  过滤器和拦截器的区别:
  ①拦截器是基于java的反射机制的,而过滤器是基于函数回调。
  ②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
  ③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
  ④拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
  ⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
  ⑥拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。
  写了点测试代码,顺便整理一下思路,搞清楚这几者之间的顺序:
  1.过滤器是JavaEE标准,采用函数回调的方式进行。是在请求进入容器之后,还未进入Servlet之前进行预处理,并且在请求结束返回给前端这之间进行后期处理。

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("before...");
        chain.doFilter(request, response);
        System.out.println("after...");
    }

  chain.doFilter(request, response);这个方法的调用作为分水岭。事实上调用Servlet的doService()方法是在chain.doFilter(request, response);这个方法中进行的。
  2.拦截器是被包裹在过滤器之中的。

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion");
    }

  a.preHandle()这个方法是在过滤器的chain.doFilter(request, response)方法的前一步执行,也就是在 [System.out.println("before...")][chain.doFilter(request, response)]之间执行。
  b.preHandle()方法之后,在return ModelAndView之前进行,可以操控Controller的ModelAndView内容。
  c.afterCompletion()方法是在过滤器返回给前端前一步执行,也就是在[chain.doFilter(request, response)][System.out.println("after...")]之间执行。
  3.SpringMVC的机制是由同一个Servlet来分发请求给不同的Controller,其实这一步是在Servlet的service()方法中执行的。所以过滤器、拦截器、service()方法,dispatc()方法的执行顺序应该是这样的,大致画了个图:其实非常好测试,自己写一个过滤器,一个拦截器,然后在这些方法中都加个断点,一路F8下去就得出了结论。
  


  总结:拦截器功在对请求权限鉴定方面确实很有用处,在我所参与的这个项目之中,第三方的远程调用每个请求都需要参与鉴定,所以这样做非常方便,而且他是很独立的逻辑,这样做让业务逻辑代码很干净。和框架的其他功能一样,原理很简单,使用起来也很简单,大致看了下SpringMVC这一部分的源码,其实还是比较容易理解的。
  我们项目中仅仅用到了preHandle这个方法,而未用其他的,框架提供了一个已经实现了拦截器接口的适配器类HandlerInterceptorAdapter,继承这个类然后重写一下需要用到的方法就行了,可以少几行代码,这种方式Java中很多地方都有体现。
以上部分是摘自神一样存在的博客,参考了一下这个帖子:http://haohaoxuexi.iteye.com/blog/1750680
大家还可以参考一下这个电子书的截图:


  • 大小: 125.8 KB
  • 大小: 105.4 KB
分享到:
评论

相关推荐

    防止SpringMVC拦截器拦截js等静态资源文件的解决方法

    在本文中,我们讨论了三种解决SpringMVC拦截器拦截静态资源文件的方法,并对这些方法的优劣进行了分析。 方案一是在拦截器中排除静态资源路径。在SpringMVC的配置文件中(通常是spring-mvc.xml),可以通过配置元素...

    SpringMVC拦截器

    虽然拦截器和过滤器都可以用于处理请求和响应的通用性问题,但它们之间存在一些重要的区别: 1. **生命周期**:过滤器是由Servlet容器管理的,其生命周期与容器相同;而拦截器是由SpringMVC框架管理的,其生命周期...

    springmvc 拦截器

    9. **与其他过滤器的区别** 虽然拦截器与Servlet Filter在功能上有相似之处,但它们的执行时机和作用范围不同。Filter更底层,作用于所有请求,而拦截器只作用于Spring MVC的请求处理路径。 10. **最佳实践** - ...

    SpringMVC的拦截器(Interceptor)和过滤器(Filter)的区别与联系

    在Java Web开发中,Spring MVC框架提供了两种机制来处理请求:拦截器(Interceptor)和过滤器(Filter)。它们都是在请求被控制器处理之前和之后执行的一系列预处理和后处理操作,但它们在功能、使用场景和工作原理...

    SpringMVC - 拦截器

    7. **与其他过滤器的区别** - 相比于传统的 Servlet 过滤器,SpringMVC 拦截器更专注于业务逻辑,更易于管理和扩展。过滤器是在 Servlet 容器层面处理请求和响应,而拦截器是在 SpringMVC 框架内部操作,提供了更多...

    spring mvc拦截器过滤json中的null值

    在Spring MVC框架中,我们经常需要处理...通过这种方式,我们不仅实现了JSON数据中null值的过滤,而且还可以根据需要扩展拦截器,比如添加更多的过滤规则或者日志记录。这使得我们的应用在处理数据时更加灵活和可控。

    idea+maven+springmvc 登录过滤器

    在IT行业中,构建一个安全的Web应用程序是至关重要的,而登录过滤器和请求拦截器是实现这一目标的关键组件。本文将详细讲解如何使用IntelliJ IDEA(Idea)、Maven和Spring MVC框架来创建一个登录过滤器,以及如何将...

    SpringMVC拦截器运行原理及配置详解

    SpringMVC拦截器的运行原理是基于Java的反射机制和AOP(Aspect-Oriented Programming)思想的。拦截器可以在 Controller 方法执行前、后或抛出异常时执行某些操作,拦截器可以 intercept Controller 方法的执行,...

    浅谈SpringMVC的拦截器(Interceptor)和Servlet 的过滤器(Filter)的区别与联系 及SpringMVC 的配置文件

    在本文中,我们将深入探讨SpringMVC的拦截器(Interceptor)和Servlet的过滤器(Filter)之间的差异和联系,以及如何配置SpringMVC的拦截器。理解这两者的区别对于开发高效且安全的Web应用程序至关重要。 首先,让我们...

    spirngmvc拦截器,拦截处理body和表单值.rar

    总结来说,Spring MVC的拦截器和过滤器是控制层的重要组成部分,它们允许我们在请求生命周期的不同阶段插入自定义逻辑。通过`WebMvcConfigurer`接口,我们可以灵活地配置这些组件,以满足特定的应用场景需求,无论是...

    浅谈springMVC拦截器和过滤器总结

    拦截器是Spring MVC框架的一部分,它基于AOP(面向切面编程)思想,主要用来处理请求和响应之间的一些业务逻辑,例如权限验证、日志记录、性能监控等。在Spring MVC的配置中,拦截器通过`<mvc:interceptors>`标签...

    完整版 Java开发实训课程系列-SpringMVC框架技术教程 第8章 拦截器 (共12页).pptx

    SpringMVC框架是Java开发中广泛使用的Web MVC框架,它为开发者提供了强大的功能,包括模型-视图-控制器模式的支持、数据绑定、异常处理、以及我们这里关注的拦截器(Interceptor)。拦截器在SpringMVC中扮演着重要的...

    springmvc+shiro自定义过滤器的实现代码

    1. SpringMVC拦截器 在SpringMVC中,拦截器(Interceptor)是一种特殊的Bean,它可以在请求处理之前、之后或在视图渲染之前执行某些操作。在本文中,我们使用拦截器来实现用户登录后的跳转回之前页面的功能。 2. ...

    J简单的springmvc包括拦截、session设置,超时跳转

    这可以通过监听器、过滤器或者在拦截器中实现。例如,在拦截器的`preHandle()`方法中,检查当前请求的Session是否有效,如果发现Session已经过期,就通过`response.sendRedirect(String url)`重定向到登录页面。 在...

    过滤器与过滤器

    在这个基于SpringMVC的简单示例中,我们将探讨过滤器和拦截器的工作原理以及它们的区别。 过滤器是Java Servlet规范的一部分,通过实现javax.servlet.Filter接口来创建。过滤器在请求到达目标Servlet或JSP之前进行...

    Spring mvc拦截器实现原理解析

    拦截器与过滤器的区别: * 过滤器是Servlet规范中的一部分,任何Java Web工程都可以使用。在url-pattern中配置了/*之后,可以对所有要访问的资源进行拦截。 * 拦截器是Spring MVC框架自己的,只有使用了Spring MVC...

    Java实训教程 Java软件开发实战 Java开发框架介绍 SpringMVC_5_常用注解 共22页.pptx

    #### 十一、SpringMVC_10_拦截器 - **拦截器实现**:实现`HandlerInterceptor`接口或继承`HandlerInterceptorAdapter`类。 - **拦截器功能**:可用于日志记录、权限检查等场景。 - **拦截器注册**:通过配置文件或...

    SpringMVC.pdf

    拦截器与过滤器是两个不同的概念,过滤器是在请求到达Servlet之前对请求或响应进行预处理或后处理的一种技术,而拦截器则是在SpringMVC框架内部通过反射机制实现的,能够更加精细地控制请求的处理。 在Web应用开发...

    浅析java中 Spring MVC 拦截器作用及其实现

    这篇文章将深入探讨Spring MVC拦截器的作用、实现方式以及其在实际应用中的使用场景,并对比拦截器与过滤器的区别。 首先,让我们来看看如何实现一个Spring MVC拦截器: 1. **编写拦截器类**:你需要创建一个类并...

    SpringMVC第三天.pdf

    2. **自定义拦截器与过滤器(Filter)的区别** - **过滤器**:是一种更底层的技术,可以拦截任何HTTP请求,无论是否是通过SpringMVC处理的请求。 - **自定义拦截器**:仅能拦截通过SpringMVC处理的请求,即那些映射...

Global site tag (gtag.js) - Google Analytics