Java过滤器与SpringMVC拦截器之间的关系与区别
今天学习和认识了一下,过滤器和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拦截器之间的关系与区别相关推荐
- Java Servlet 过滤器与 springmvc 拦截器的区别?
前言:在工作中,遇到需要记录日志的情况,不知道该选择过滤器还是拦截器,故总结了一下. servlet 过滤器 定义 java过滤器能够对目标资源的请求和响应进行截取.过滤器的工作方式分为四种 应用场景 ...
- Servlet过滤器与SpringMVC拦截器
Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter.Web开发人员通过Filter技术,对web服务器 ...
- SpringMVC拦截器之拦截器接口方法演示
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven ...
- Java类加载器之间的关系
一.三种类加载器 当 JVM 启动的时候,Java 缺省开始使用如下三种类型的类加载器: 启动(Bootstrap)类加载器:引导类加载器是用 本地代码实现的类加载器,它负责将 <JAVA_HO ...
- SpringMVC拦截器之介绍和搭建环境
- Spring SpringMVC SpringBoot SpringCloud概念、关系及区别
一.正面解读: Spring主要是基于IOC反转Beans管理Bean类,主要依存于SSH框架(Struts+Spring+Hibernate)这个MVC框架,所以定位很明确,Struts主要负责表示 ...
- [转]Spring SpringMVC SpringBoot SpringCloud概念、关系及区别
一.正面解读: Spring主要是基于IOC反转Beans管理Bean类,主要依存于SSH框架(Struts+Spring+Hibernate)这个MVC框架,所以定位很明确,Struts主要负 ...
- 2.Java中String,StringBuilder以及StringBuffer的关系与区别
String StringBuffer StringBuilder String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且浪费大量 ...
- 推荐: 五分钟搞懂Xen、KVM、Qemu间的关系和区别[转载]
https://blog.csdn.net/ysbj123/article/details/51166343 转载于:https://www.cnblogs.com/wspblog/p/9203061 ...
最新文章
- Eclipse中修改tomcat内存大小
- mysql 商业版备份_MySQL企业版备份工具MEB
- 点火提前角的修正方式有哪些_“天问一号”完成第二次轨道中途修正:精度很高,本次修正量很小...
- linux内核多队列,Linux Kernel 中 Workqueue 使用系统默认队列和创建队列的方法
- young people can also be a leader
- 有没有什么好的C++视频教程?
- Qt工作笔记-QMenu::exec中使用QWidget::mapToGlobal()与QCursor::pos()之间的些许差异
- 查看工作组计算机没有服务器,计算机相关:网上邻居问题:当前工作组的服务器列表无法使用...
- 【Java】【编译】javac编译源代码时,若源文件使用了别的java源代码的函数,javac会自动关联。...
- Oracle用户及角色的权限管理[Oracle基础]
- 使用MyEclipse的自动提醒功能卡死MyEclipse的激活
- eclipse设置背景图片(并非更换主题)
- html 中 鼠标滑轮实现横向滚动
- 个人所得税法应充分体现经济法原则
- [redis]知识回顾之redis主从+哨兵搭建简要记录
- linux探索之旅pdf,【Linux探索之旅】第四部分第一課:壓縮文件,解壓無壓力
- 为实体提供枚举类型的支持
- Mac版excel如何快速进行数据拆分?
- VS 调试时“还没有为该文档加载任何符号”
- Linux RPM包管理及yum安装用法
热门文章
- 腾讯 JDK 11 正式开源,高性能、太牛逼啦!
- 面进了心心念念的国企!以为TM上岸了!干了1年!我却再次选择回到互联网大厂内卷!
- 还在用if(obj!=null)做非空判断?带你快速上手Optional实战性理解!
- BeanUtils 是用 Spring 的还是 Apache 的好?
- SpringBoot缓存应用实践
- 碰到Maven依赖冲突,想砸电脑?这个IDEA插件必须了解一下...
- 介绍 9 款 MySQL 常见的图形化工具,第三款我用了 10 年
- 微服务架构之「 服务注册 」
- 周志华,李航来智源大会了!
- 鱼佬:我的数据挖掘之路!