我的编程空间,编程开发者的网络收藏夹
学习永远不晚

SpringMVC超详细介绍自定义拦截器

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

SpringMVC超详细介绍自定义拦截器

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 {
    
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MyInterceptor01 --preHandle");
        return true;
    }
    
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("MyInterceptor01-postHandle");
    }
    
    @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拦截器内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

SpringMVC超详细介绍自定义拦截器

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java SpringMVC如何实现自定义拦截器

本篇内容主要讲解“Java SpringMVC如何实现自定义拦截器”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java SpringMVC如何实现自定义拦截器”吧!SpringMVC实现自定义
2023-06-29

android 自定义控件 自定义属性详细介绍

自定义控件在android中无处不见,自定义控件给了我们很大的方便。比如说,一个视图为imageview ,imagebutton ,textview 等诸多控件的组合,用的地方有很多,我们不可能每次都来写3个的组合,既浪费时间,效率又低。
2022-06-06

SpringMVC实现自定义拦截器登录检测功能

这篇文章主要介绍“SpringMVC实现自定义拦截器登录检测功能”,在日常操作中,相信很多人在SpringMVC实现自定义拦截器登录检测功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”SpringMVC实现
2023-06-20

Android自定义控件属性详细介绍

Android自定义控件属性详细介绍1. reference:参考某一资源ID。 (1)属性定义: 2023-05-31

Android 自定义View的构造函数详细介绍

Android自定义View的构造函数自定义View是Android中一个常见的需求,每个自定义的View都需要实现三个基本的构造函数,而这三个构造函数又有两种常见的写法。 第一种 每个构造函数分别调用基类的构造函数,再调用一个公共的初始
2022-06-06

SpringBoot配置自定义拦截器实现过程详解

在系统中经常需要在处理用户请求之前和之后执行一些行为,例如检测用户的权限,或者将请求的信息记录到日志中,即平时所说的"权限检测"及"日志记录",下面这篇文章主要给大家介绍了关于在SpringBoot项目中整合拦截器的相关资料,需要的朋友可以参考下
2022-11-13

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录