0、 参考网址:

  • 拦截器和过滤器的区别:https://www.jianshu.com/p/7bd0cad17f23
  • Interceptor使用:https://blog.csdn.net/weixin_36927395/article/details/81067146

1、过滤器,拦截器,切面

  • 1.过滤器(Filter):所谓过滤器顾名思义是用来过滤的,Java的过滤器能够为我们提供系统级别的过滤,也就是说,能过滤所有的web请求,
    这一点,是拦截器无法做到的。在Java Web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或
    者struts的action进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者struts
    的action前统一设置字符集,或者去除掉一些非法字符(聊天室经常用到的,一些骂人的话)。filter 流程是线性的,url传来之后,检查之后,
    可保持原来的流程继续向下执行,被下一个filter, servlet接收。
  • 2.监听器(Listener):Java的监听器,也是系统级别的监听。监听器随web应用的启动而启动。Java的监听器在c/s模式里面经常用到,它
    会对特定的事件产生产生一个处理。监听在很多模式下用到,比如说观察者模式,就是一个使用监听器来实现的,在比如统计网站的在线人数。
    又比如struts2可以用监听来启动。Servlet监听器用于监听一些重要事件的发生,监听器对象可以在事情发生前、发生后可以做一些必要的处理。
  • 3.拦截器(Interceptor):java里的拦截器提供的是非系统级别的拦截,也就是说,就覆盖面来说,拦截器不如过滤器强大,但是更有针对性。
    Java中的拦截器是基于Java反射机制实现的,更准确的划分,应该是基于JDK实现的动态代理。它依赖于具体的接口,在运行期间动态生成字节码。
    拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action执行前阻止其
    执行,同时也提供了一种可以提取Action中可重用部分代码的方式。在AOP中,拦截器用于在某个方法或者字段被访问之前,进行拦截然后再之前或
    者之后加入某些操作。java的拦截器主要是用在插件上,扩展件上比如 Hibernate Spring Struts2等,有点类似面向切片的技术,在用之前先要在
    配置文件即xml,文件里声明一段的那个东西。

2、过滤器

  • 以上可知:过滤器和拦截器有时可以实现相同的功能,比如登录鉴权
    ,但是这个并不是Spring推荐的;

Filter特性:

  • Filter在程序启动的时候启动一次
  • 不能拥有service对象,数据源,事务管理
  • 可以拦截静态资源(可以才是它的存在意义)
  • 结合SpringMVC内置的filter做参考:https://www.cnblogs.com/a8457013/p/8260867.html

基于以上,
1)我们可以对资源类文件进行拦截(设定字符编码)
2)进行URL级别的访问控制(并非登录这一种控制,是不是内部接口,是否允许外部接口调用)
3)。。。

Filter使用:

1、创建Filter

public class TimeFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) {System.out.println("过滤器初始化");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("过滤器执行了");long start2 = System.currentTimeMillis();filterChain.doFilter(servletRequest, servletResponse);long time = System.currentTimeMillis() - start2;System.out.println("过滤器执行的时间是 :" + time);System.out.println("过滤器执行结束");}@Overridepublic void destroy() {System.out.println("过滤器销毁了");}
}

2、web.xml中配置(可以配置多个,从上到下执行)

<!-- 自定义过滤器 -->  <filter>    <filter-name>firstfilter</filter-name>    <filter-class>com.filter.filterFirst</filter-class>    <!-- 设置初始化参数 -->  <init-param>    <param-name>nofilterpath</param-name>    <param-value>login</param-value>    </init-param>    </filter>    <filter-mapping>    <filter-name>firstfilter</filter-name>    <url-pattern>/*</url-pattern>    </filter-mapping>

3、访问顺序:

4、生命周期

生命周期


3、拦截器

拦截器使用

1、创建Interceptor

public class TestInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {System.out.println("preHandle");return true;}@Overridepublic void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {System.out.println("postHandle");}@Overridepublic void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {System.out.println("afterCompletion");}
}

2、在web.xml中配置

   <!-- 配置拦截器 --><mvc:interceptors><!-- 全局的拦截器 --><bean class="com.xcy.interceptor.HandlerInterceptor1" /><!-- 指定路径拦截器,按顺序执行 --><mvc:interceptor><mvc:mapping path="/api/user/**" /> <bean class="com.xcy.interceptor.HandlerInterceptor2" /></mvc:interceptor><mvc:interceptor><mvc:mapping path="/api/person/**" /><bean class="com.xcy.interceptor.HandlerInterceptor3" /></mvc:interceptor></mvc:interceptors>

3、调用链

拦截器和过滤器执行顺序:
1).Filter.init();
2).Filter.doFilter(); before doFilter
3).HandlerInterceptor.preHandle();
4).Controller方法执行
5).HandlerInterceptor.postHandle();
6).DispatcherServlet视图渲染
7).HandlerInterceptor.afterCompletion();
8).Filter.doFilter(); after doFilter
9).Filter.destroy();

preHandle是在请求到达Controller之前实现,可进行用户校验登录等操作,返回true后,请求到达Controller层;postHandle方法是在执行完Controller层代码之后,DispatcherServlet进行视图的渲染之前

执行,因此可以对ModelAndView 对象进行处理;afterCompletion方法是在DispatcherServlet进行视图的渲染之后执行调用,主要是进行一些资源清理等工作。

注:只能对Controller请求进行拦截,对一些静态资源无法拦截。


4、过滤器和拦截器的区别

过滤器和拦截器的区别:
①拦截器是基于java的反射机制的,而过滤器是基于函数回调。
②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
④拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
⑥拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。


5、总结

  • 在这篇博客里有一个理论:

其实我感觉这种理解方式也是对的,因为在SpringBoot中使用时,貌似就是这种概念!

008--【SpringBoot】过滤器,拦截器,切面相关推荐

  1. SpringBoot的过滤器拦截器AOP和异常处理器

    目录 前言 过滤器 创建过滤器 拦截器 创建拦截器 配置拦截器 AOP 创建AOP 异常处理器 创建异常处理器 测试请求的执行过程 创建接口 发送请求 前言 过滤器.拦截器.AOP.异常处理器是搭建系 ...

  2. Spring Boot 系列:过滤器+拦截器+监听器

    原 Swagger 文章合并到 Spring Boot 系列:配置 Swagger2 一.过滤器 - Filter 过滤器是处于客户端和服务器资源文件之间的一道过滤网,帮助我们过滤掉一些不符合要求的请 ...

  3. 【SpringBoot】拦截器使用@Autowired注入接口为null解决方法

    [SpringBoot]拦截器使用@Autowired注入接口为null解决方法 参考文章: (1)[SpringBoot]拦截器使用@Autowired注入接口为null解决方法 (2)https: ...

  4. SpringBoot——使用拦截器拦截未登录用户

    前置知识SpringBoot配置拦截器基于HandlerInterceptor接口实现,关键三个方法 preHandle()执行目标之前 postHandle()执行目标之后 afterComplet ...

  5. SpringBoot与拦截器

    自定义拦截器 package com.buba.interceptor;import com.buba.pojo.User; import org.springframework.web.servle ...

  6. SpringBoot配置拦截器导致swagger失效

    问题背景: Springboot 启用拦截器后,Swagger无法访问 原因 拦截器拦截了所有的请求,导致swagger也被拦截,当在进行鉴权的的时候,可能需要传入一些特定的参数,或者请求头信息,这样 ...

  7. springboot Interceptor拦截器excludePathPatterns失效

    springboot Interceptor拦截器excludePathPatterns失效 使用jwt和HandlerInterceptorAdapter做登录的拦截放行失效,其实更多时候不是配置文 ...

  8. springboot设置拦截器的方法

    springboot设置拦截器的方式: 1.编写一个类,在类上面加上@Configuration注解,然后继承 WebMvcConfigurerAdapter. 重写父类的方法:addIntercep ...

  9. springboot项目拦截器中获取接口返回数据_Spring Boot自定义Annotation实现接口自动幂...

    在实际的开发项目中,一个对外暴露的接口往往会面临很多次请求,我们来解释一下幂等的概念:任意多次执行所产生的影响均与一次执行的影响相同.按照这个含义,最终的含义就是 对数据库的影响只能是一次性的,不能重 ...

  10. springcloud springboot 异常拦截器 项目完善03

    springcloud springboot 异常拦截器 项目完善03 > 创建异常拦截器,在controller层没处理的异常抛出时,异常拦截器拦截后输入自定义的报错信息. 新建GlobalE ...

最新文章

  1. SaaS加速器 I 商业中心:提供商业助力 共享商业成功
  2. 直接导入用户信息到discuz ucenter.
  3. 三维的对象表示---OpenGL二次曲面和三次曲面函数
  4. WPF的ProgressBar进度条
  5. Linux操作(5)——创建硬链接与软链接
  6. 银河麒麟V10入选2020中国十大科技新闻
  7. python安装requests第三方模块
  8. Win7的市场份额终于超过XP了,以后可以逐渐考虑放弃ie6/7了!
  9. html中basefont标签,HTML的basefont标签
  10. Python 给字符串进行加密,生成唯一固定长度字符串
  11. sis地址获取器_TencentOS tiny深度源码分析(2)—— 调度器
  12. 基于JAVA+SpringBoot+Mybatis+MYSQL的小区物业管理系统
  13. redhad安装git
  14. MFC程序设计——标尺的例子
  15. 奔图cp2510dn linux,奔图CP2510DN驱动
  16. macpro下docker安装目录_macos – 在mac os下的Docker deamon配置路径
  17. 俄亥俄州立大学计算机科学转学成功,录取捷报|努力定有回报,斩获俄亥俄州立计算机转学录取...
  18. oracle查找隐藏字符串,oracle chr(0) 隐藏字符串
  19. Linux 查看磁盘空间命令
  20. 网络安全学习和CTF必不可少的一些网站

热门文章

  1. How does “mov (%ebx,%eax,4),%eax” work?
  2. android手机设置查看电池耗电,安卓查看电池损耗代码【搞定指南】
  3. spring 代码执行 (CVE-2018-1273)
  4. mysql求月平均_mysql求平均值
  5. 百度云下载不限速方法+软件
  6. 计算机连接网络需要什么,宽带怎么安装需要什么_安装宽带步骤-系统城
  7. 个别网站无法访问,能ping通
  8. Matlab论文插图绘制模板第28期—柱状图(带误差棒errorbar)
  9. c语言考试的说说带图片致自己,励志说说带图片致自己
  10. 电话号码被标记了怎么取消?标记取消最强攻略来了