今天学习和认识了一下,过滤器和SpringMVC的拦截器的区别,学到了不少的东西,以前一直以为拦截器就是过滤器实现的,现在想想还真是一种错误啊,而且看的比较粗浅,没有一个全局而又细致的认识,由于已至深夜,时间原因,我就把一些网友的观点重点摘录下来,大家仔细看后也一定会有一个比较新的认识(在此非常感谢那些大牛们的无私奉献,分享他们的经验与心得,才能让像我这样的小白有机会站一下你们这些巨人的肩膀,才能少走些弯路)。
过滤器和拦截器的区别:
①拦截器是基于java的反射机制的,而过滤器是基于函数回调。  
②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。  
③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。  
④拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。  
⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
⑥拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。

写了点测试代码,顺便整理一下思路,搞清楚这几者之间的顺序地址:

1.过滤器是JavaEE标准,采用函数回调的方式进行。是在请求进入容器之后,还未进入Servlet之前进行预处理,并且在请求结束返回给前端这之间进行后期处理。

    @Overridepublic 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.拦截器是被包裹在过滤器之中的。

    @Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("preHandle");        return true;}    @Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("postHandle");}    @Overridepublic 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下去就得出了结论下载地址  。

Paste_Image.png

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

转载于:https://blog.51cto.com/11701009/1787057

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

  1. Java Servlet 过滤器与 springmvc 拦截器的区别?

    前言:在工作中,遇到需要记录日志的情况,不知道该选择过滤器还是拦截器,故总结了一下. servlet 过滤器 定义 java过滤器能够对目标资源的请求和响应进行截取.过滤器的工作方式分为四种 应用场景 ...

  2. Servlet过滤器与SpringMVC拦截器

    Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter.Web开发人员通过Filter技术,对web服务器 ...

  3. SpringMVC拦截器之拦截器接口方法演示

    <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven ...

  4. Java类加载器之间的关系

    一.三种类加载器 当 JVM 启动的时候,Java 缺省开始使用如下三种类型的类加载器: 启动(Bootstrap)类加载器:引导类加载器是用 本地代码实现的类加载器,它负责将 <JAVA_HO ...

  5. SpringMVC拦截器之介绍和搭建环境

  6. Spring SpringMVC SpringBoot SpringCloud概念、关系及区别

    一.正面解读: Spring主要是基于IOC反转Beans管理Bean类,主要依存于SSH框架(Struts+Spring+Hibernate)这个MVC框架,所以定位很明确,Struts主要负责表示 ...

  7. [转]Spring SpringMVC SpringBoot SpringCloud概念、关系及区别

     一.正面解读: Spring主要是基于IOC反转Beans管理Bean类,主要依存于SSH框架(Struts+Spring+Hibernate)这个MVC框架,所以定位很明确,Struts主要负 ...

  8. 2.Java中String,StringBuilder以及StringBuffer的关系与区别

    String     StringBuffer     StringBuilder String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且浪费大量 ...

  9. 推荐: 五分钟搞懂Xen、KVM、Qemu间的关系和区别[转载]

    https://blog.csdn.net/ysbj123/article/details/51166343 转载于:https://www.cnblogs.com/wspblog/p/9203061 ...

最新文章

  1. Eclipse中修改tomcat内存大小
  2. mysql 商业版备份_MySQL企业版备份工具MEB
  3. 点火提前角的修正方式有哪些_“天问一号”完成第二次轨道中途修正:精度很高,本次修正量很小...
  4. linux内核多队列,Linux Kernel 中 Workqueue 使用系统默认队列和创建队列的方法
  5. young people can also be a leader
  6. 有没有什么好的C++视频教程?
  7. Qt工作笔记-QMenu::exec中使用QWidget::mapToGlobal()与QCursor::pos()之间的些许差异
  8. 查看工作组计算机没有服务器,计算机相关:网上邻居问题:当前工作组的服务器列表无法使用...
  9. 【Java】【编译】javac编译源代码时,若源文件使用了别的java源代码的函数,javac会自动关联。...
  10. Oracle用户及角色的权限管理[Oracle基础]
  11. 使用MyEclipse的自动提醒功能卡死MyEclipse的激活
  12. eclipse设置背景图片(并非更换主题)
  13. html 中 鼠标滑轮实现横向滚动
  14. 个人所得税法应充分体现经济法原则
  15. [redis]知识回顾之redis主从+哨兵搭建简要记录
  16. linux探索之旅pdf,【Linux探索之旅】第四部分第一課:壓縮文件,解壓無壓力
  17. 为实体提供枚举类型的支持
  18. Mac版excel如何快速进行数据拆分?
  19. VS 调试时“还没有为该文档加载任何符号”
  20. Linux RPM包管理及yum安装用法

热门文章

  1. 腾讯 JDK 11 正式开源,高性能、太牛逼啦!
  2. 面进了心心念念的国企!以为TM上岸了!干了1年!我却再次选择回到互联网大厂内卷!
  3. 还在用if(obj!=null)做非空判断?带你快速上手Optional实战性理解!
  4. BeanUtils 是用 Spring 的还是 Apache 的好?
  5. SpringBoot缓存应用实践
  6. 碰到Maven依赖冲突,想砸电脑?这个IDEA插件必须了解一下...
  7. 介绍 9 款 MySQL 常见的图形化工具,第三款我用了 10 年
  8. 微服务架构之「 服务注册 」
  9. 周志华,李航来智源大会了!
  10. 鱼佬:我的数据挖掘之路!