前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Web MVC 拦截器

Spring Web MVC 拦截器

作者头像
Demo_Null
发布2020-09-28 12:03:01
5720
发布2020-09-28 12:03:01
举报
文章被收录于专栏:Java 学习

1.1 简介

1.1.1 概述

  Spring Web MVC 的拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理。将拦截器按一定的顺序联结成一条链,这条链称为拦截器链(InterceptorChain)。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。拦截器也是 AOP思想的具体实现。

1.1.2 拦截器(interceptor)和过滤器(filter)区别

区别

过滤器

拦截器

使用范围

Servlet 中的一部分,任何 Java Web 工程都可以使用

Spring Web MVC 框架独有

拦截范围

配置了 / 全部拦截

只会拦截访问控制器方法的请求,*.js 等不会拦截

1.2 简单示例

1.2.1 自定义拦截器

代码语言:javascript
复制
/**
 * Created with IntelliJ IDEA.
 *
 * @author Demo_Null
 * @date 2020/8/27
 * @description 自定义拦截器
 */
 // 实现 HandlerInterceptor 并重写需要的方法
public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, 
                             Object handler) throws Exception {
        System.out.println("在目标方法执行之前执行");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, 
                           Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("在目标方法执行之后视图对象返回之前执行");

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, 
                                Object handler, Exception ex) throws Exception {
        System.out.println("在流程都执行完毕后执行");
    }
}
1.2.2 配置拦截器
代码语言:javascript
复制
    <!-- 配置拦截器 -->
    <mvc:interceptors>
    	<!-- 可配置多个拦截器,执行顺序为配置顺序 -->
        <mvc:interceptor>
            <!-- 拦截的资源路径 -->
            <mvc:mapping path="/**"/>
            <!-- 指定自定义拦截器 -->
            <bean class="com.software.spring.controller.MyInterceptor" />
        </mvc:interceptor>
    </mvc:interceptors>

1.2.3 控制器

代码语言:javascript
复制
/**
 * Created with IntelliJ IDEA.
 *
 * @author Demo_Null
 * @date 2020/8/27
 * @description 控制器
 */
@RestController
@RequestMapping("/demo")
public class DemoController {

    @GetMapping("/get")
    public String get() {
        System.out.println("请求到了");
        return "10086";
    }
}
在这里插入图片描述
在这里插入图片描述

1.3 HandlerInterceptor 中的方法

1.3.1 preHandle

  方法将在请求处理之前进行调用,该方法的返回值是布尔值 Boolean 类型的,当它返回为 false 时,表示请求结束,后续的 Interceptor 和 Controller 都不会再执行;当返回值为 true 时就会继续调用下一个 Interceptor 的 preHandle 方法。

1.3.2 postHandle

  该方法是在当前请求进行处理之后被调用,前提是 preHandle 方法的返回值为 true 时才能被调用,且它会在 DispatcherServlet 进行视图返回渲染之前被调用,所以我们可以在这个方法中对 Controller 处理之后的 ModelAndView 对象进行操作

1.3.2 afterCompletion

  该方法将在整个请求结束之后,也就是在 DispatcherServlet 渲染了对应的视图之后执行,前提是 preHandle 方法的返回值为 true 时才能被调用

1.3.2 执行顺序

  当拦截器的 preHandle 方法返回 true 则会执行目标资源,如果返回 false 则不执行目标资源;多个拦截器情况下,配置在前的先执行,配置在后的后执行;单个拦截器中的方法执行顺序是:preHandler目标资源postHandleafterCompletion;多个拦截器中的方法执行顺序是:preHandler_1preHandler_2···preHandler_n目标资源postHandle_n···postHandle_2postHandle_1afterCompletion_n ☞ ··· ☞ afterCompletion_2afterCompletion_1

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/08/27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.1 简介
    • 1.1.1 概述
      • 1.1.2 拦截器(interceptor)和过滤器(filter)区别
      • 1.2 简单示例
        • 1.2.1 自定义拦截器
          • 1.2.2 配置拦截器
        • 1.2.3 控制器
        • 1.3 HandlerInterceptor 中的方法
          • 1.3.1 preHandle
            • 1.3.2 postHandle
              • 1.3.2 afterCompletion
                • 1.3.2 执行顺序
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档