1.什么是拦截器

说明

  • Spring MVC 也可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能.
  • 自定义的拦截器必须实现 HandlerInterceptor 接口

自定义拦截器的三个方法

  • preHandle():这个方法在业务处理器处理请求之前被调用,在该方法中对用户请求 request 进行处理。
  • postHandle():这个方法在目标方法处理完请求后执行
  • afterCompletion():这个方法在完全处理完请求后被调用,可以在该方法中进行一些资源 清理的操作。

2.自定义拦截器执行流程图

自定义拦截器执行流程说明

  • 如果 preHandle 方法 返回 false, 则不再执行目标方法, 可以在此指定返回页面
  • postHandle 在目标方法被执行后执行. 可以在方法中访问到目标方法返回的 ModelAndView 对象
  • 若 preHandle 返回 true, 则 afterCompletion 方法 在渲染视图之后被执行.
  • 若 preHandle 返回 false, 则 afterCompletion 方法不会被调用
  • 在配置拦截器时,可以指定该拦截器对哪些请求生效,哪些请求不生效,如果不配置默认对所有请求生效

3.自定义拦截器应用实例

1.快速入门

● 应用实例需求

完成一个自定义拦截器,学习一下如何配置拦截器和拦截器的运行流程

● 应用实例-代码实现

1.自定义拦截器

/**
 * 自定义拦截器
 */
@Component
public class MyInterceptor01 implements HandlerInterceptor {
    /**
     * 1.preHandle 方法在目标方法执行前被执行
     * 2.如果返回fasle则不在执行目标方法
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MyInterceptor01 --preHandle");
        return true;
    }
    /**
     * 1. 在目标方法执行后,会执行postHandle
     * 2. 该方法可以获取到 目标方法,返回的ModelAndView对象
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("MyInterceptor01-postHandle");
    }
    /**
     *1. afterCompletion() 在视图渲染后被执行, 这里可以进行资源清理工作
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("MyInterceptor01-afterCompletion");
    }
}

2.配置拦截器

拦截配置有三种方式

(1)不指定拦截规则,默认拦截所有

<!--配置自定义拦截器-spring配置文件-->
<mvc:interceptors>
    <!--第一种方式,不指定拦截规则默认拦截所有请求-->
    <ref bean="myInterceptor01"></ref>
</mvc:interceptors>

(2)指定明确的拦截路径

<!--配置自定义拦截器-spring配置文件-->
<mvc:interceptors>
    <!--第一种方式,不指定拦截规则默认拦截所有请求-->
    <!--<ref bean="myInterceptor01"></ref>-->
    <!--第二种指定拦截路径-->
    <mvc:interceptor>
        <mvc:mapping path="/hi"/>
        <ref bean="myInterceptor01"/>
    </mvc:interceptor>
</mvc:interceptors>

(3)通配符方式,也可用于指定不拦截路径

    <!--配置自定义拦截器-spring配置文件-->
    <mvc:interceptors>
        <!--第一种方式,不指定拦截规则默认拦截所有请求-->
        <!--<ref bean="myInterceptor01"></ref>-->
        <!--第二种指定拦截路径-->
  <!--      <mvc:interceptor>
            <mvc:mapping path="/hi"/>
            <ref bean="myInterceptor01"/>
        </mvc:interceptor>-->
      <mvc:interceptor>
          <!--通配符方式 表示拦截 /h 打头的路径-->
          <mvc:mapping path="/h*"/>
          <!--/hello不拦截-->
          <mvc:exclude-mapping path="/hello"/>
          <!--指定对哪个拦截器配置-->
          <ref bean="myInterceptor01"/>
      </mvc:interceptor>
    </mvc:interceptors>

3.创建FurnHandler.java

@Controller
public class FurnHandler {
    @RequestMapping(value = "/hi")
    public String hi(User user) {
        System.out.println("---FurnHandler--hi()---");
        return "success";
    }
    @RequestMapping(value = "/hello")
    public String hello() {
        System.out.println("---FurnHandler--hello()---");
        return "success";
    }
    @RequestMapping(value = "/ok")
    public String ok() {
        System.out.println("---FurnHandler--ok()---");
        return "success";
    }
}

4.interceptor.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>测试自定义拦截器</title>
</head>
<body>
<h1>测试自定义拦截器</h1>
<a href="<%=request.getContextPath()%>/hi" rel="external nofollow" >测试自定义拦截器-hi</a><br><br>
<a href="<%=request.getContextPath()%>/hello" rel="external nofollow" >测试自定义拦截器-hello</a><br/><br/>
<a href="<%=request.getContextPath()%>/ok" rel="external nofollow" >测试自定义拦截器-ok</a><br><br>
</body>
</html>

5.测试

2.注意事项和细节

1、默认配置是都所有的目标方法都进行拦截, 也可以指定拦截目标方法, 比如只是拦截 hi

<mvc:interceptor> 
    <mvc:mapping path="/hi"/> 
    <ref bean="myInterceptor01"/> 
</mvc:interceptor>

2、mvc:mapping 支持通配符, 同时指定不对哪些目标方法进行拦截

<mvc:interceptor> 
    <mvc:mapping path="/h*"/> 
    <mvc:exclude-mapping path="/hello"/> 
    <ref bean="myInterceptor01"/> 
</mvc:interceptor>

3、拦截器需要配置才生效,不配置是不生效的.

4、如果 preHandler() 方法返回了 false, 就不会执行目标方法(前提是你的目标方法被拦截 了), 程序员可以在这里根据业务需要指定跳转页面.

3.Debug执行流程

4.多个拦截器

1.多个拦截器执行流程示意图

执行流程可以参考filter过滤器,执行顺序根据配置的先后顺序

2.应用实例

代码实现

新增拦截器

@Component
public class MyInterceptor02 implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MyInterceptor02-preHandle");
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("MyInterceptor02-postHandle");
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("MyInterceptor02-afterCompletion");
    }
}

配置拦截器

  <!--配置自定义拦截器-spring配置文件-->
  <mvc:interceptors>
      <!--第一种方式,不指定拦截规则默认拦截所有请求-->
      <!--<ref bean="myInterceptor01"></ref>-->
      <!--第二种指定拦截路径-->
<!--      <mvc:interceptor>
          <mvc:mapping path="/hi"/>
          <ref bean="myInterceptor01"/>
      </mvc:interceptor>-->
    <mvc:interceptor>
        <!--通配符方式 表示拦截 /h 打头的路径-->
        <mvc:mapping path="/h*"/>
        <!--/hello不拦截-->
        <mvc:exclude-mapping path="/hello"/>
        <!--指定对哪个拦截器配置-->
        <ref bean="myInterceptor01"/>
    </mvc:interceptor>
      <mvc:interceptor>
          <mvc:mapping path="/hi"/>
          <ref bean="myInterceptor02"/>
      </mvc:interceptor>
  </mvc:interceptors>

这里我们定义了两个拦截器myInterceptor01和myInterceptor02,两个拦截器都会对ip:port/工程路径/hi的请求进行拦截,执行结果如下图所示:

执行流程说明:拦截器的执行先后顺序根据配置的先后顺序执行

3.主要事项和细节

  • 如果第 1 个拦截器的 preHandle() 返回 false , 后面都不在执行
  • 如果第2个 拦 截 器 的 preHandle() 返 回 false , 就 直 接 执 行 第1个 拦 截 器 的 afterCompletion()方法, 如果拦截器更多,规则类似
  • 说明: 前面说的规则,都是目标方法被拦截的前提

在实际开发中我们常用拦截器对登录进行验证

到此这篇关于SpringMVC超详细介绍自定义拦截器的文章就介绍到这了,更多相关SpringMVC拦截器内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

SpringMVC超详细介绍自定义拦截器的更多相关文章

  1. vue自定义加载指令v-loading占位图指令v-showimg

    这篇文章主要为大家介绍了vue自定义加载指令和v-loading占位图指令v-showimg的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  2. JSP中springmvc配置validator的注意事项

    这篇文章主要介绍了JSP中springmvc配置validator的注意事项的相关资料,并说明springmvc中spring-servlet.xml、applicationContext.xml的区别需要的朋友可以参考下

  3. SpringMVC拦截器和异常处理器使用示例超详细讲解

    拦截器(Interceptor)是一种动态拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行。本文将详细讲讲SpringMVC中拦截器参数及拦截器链配置,感兴趣的可以尝试一下

  4. element-table如何实现自定义表格排序

    这篇文章主要介绍了element-table如何实现自定义表格排序,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  5. vue如何自定义地址设置@

    这篇文章主要介绍了vue如何自定义地址设置@,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  6. SpringBoot实现过滤器和拦截器的方法

    大家应该都晓得实现过滤器需要实现 javax.servlet.Filter 接口,而拦截器会在处理指定请求之前和之后进行相关操作,配置拦截器需要两步,本文通过实例代码给大家介绍SpringBoot 过滤器和拦截器的相关知识,感兴趣的朋友一起看看吧

  7. SpringMVC数据页响应ModelAndView实现页面跳转

    本文主要介绍了SpringMVC数据页响应ModelAndView实现页面跳转,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  8. SpringMVC静态资源配置过程详解

    在javaweb项目中配置了DispatcherServlet的情况下,如果不进行额外配置的话,几乎所有的请求都会走这个servlet来处理,默认静态资源按路径是访问不到的会报404错误,下面就来讲一讲如何配置才能访问到静态资源吧

  9. SpringBoot实现自定义事件的方法详解

    这篇文章将用实例来和大家介绍一下如何在SpringBoot中自定义事件来使用观察者模式。文中的示例代码讲解详细,对我们学习SpringBoot有一定的帮助,需要的可以参考一下

  10. React Native 中添加自定义字体的方法

    这篇文章主要介绍了如何在 React Native 中添加自定义字体,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部