今天学习和认识了一下,过滤器和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. python可视化水平箭头_Python交互图表可视化Bokeh:2. 辅助参数
  2. Fragment 复习一
  3. 【自动驾驶】28.【右手坐标系】与【右手法则】分析、【右手法则的正方向】 与 【逆时针为正方向】 的分析
  4. DNN开发中的一些细节(3)
  5. 放大镜制作(2)—此方法比较容易理解
  6. php server host,PHP $ _SERVER ['HTTP_HOST']与$ _SERVER
  7. java day65【视图[应用] 、索引[应用] 、pl/sql 基本语法[了解] 、存储过程[理解] 、 存储函数[理解]、 触发器[理解]、Java 程序调用存储过程[应用]】...
  8. nginx服务无法停止(Windows)
  9. Premiere视频剪辑软件的破解和安装
  10. 华三交换机如何进入配置_h3c交换机配置telnet配置教程
  11. pandas25 if else语句(多数据df选择)( tcy)
  12. 分析家数据格式、结构
  13. Region Proposal by Guided Anchoring阅读笔记
  14. HTML CSS 学习笔记
  15. 观察者模式与推拉模型
  16. 沈园恋之沈园诗,自创诗
  17. python基础-模仿醉汉在二维空间上的随机漫步
  18. java连接数据库,jdbc四要素,jdbc六大步
  19. 美国亚马逊图片打不开
  20. 使用计算机配置路由器,用命令配置路由器基础(

热门文章

  1. 你管这破玩意叫 CPU ?
  2. SpringBoot 三招组合拳,手把手教你打出优雅的后端接口
  3. StackOverflow上面 7个最好的Java答案
  4. Springboot启动原理解析
  5. 干货 | XGBoost在携程搜索排序中的应用
  6. 网友教会GPT-3骂人、DeepMind再造机器人
  7. 让瘫痪失语患者「说话」,脑机接口首次从大脑活动解码完整句子,登上新英格兰医学杂志...
  8. 提升 NLP 实战技能的一点建议
  9. 新型冠状病毒全球实时跟踪地图,多国研发疫苗,在中国或致8042例感染,爆发峰值预计2月中上旬 | 最新nCoV研究大汇总...
  10. 程序员请收好:10个非常有用的 Visual Studio Code 插件!