IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> SpringMVC-自定义拦截器 -> 正文阅读

[Java知识库]SpringMVC-自定义拦截器

SpringMVC-自定义拦截器

1.什么是拦截器

● 说明

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

● 自定义拦截器的三个方法

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

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

image-20220619152523801

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

  1. 如果 preHandle 方法 返回 false, 则不再执行目标方法, 可以在此指定返回页面

  2. postHandle 在目标方法被执行后执行. 可以在方法中访问到目标方法返回的 ModelAndView 对象

  3. 若 preHandle 返回 true, 则 afterCompletion 方法 在渲染视图之后被执行.

    1. 若 preHandle 返回 false, 则 afterCompletion 方法不会被调用
    2. 在配置拦截器时,可以指定该拦截器对哪些请求生效,哪些请求不生效,如果不配置默认对所有请求生效

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">测试自定义拦截器-hi</a><br><br>
<a href="<%=request.getContextPath()%>/hello">测试自定义拦截器-hello</a><br/><br/>
<a href="<%=request.getContextPath()%>/ok">测试自定义拦截器-ok</a><br><br>
</body>
</html>

5.测试

image-20220619183655939

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执行流程

image-20220619184956534

image-20220619185145634

4.多个拦截器

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

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

image-20220619153018055

image-20220619153111317

2.应用实例1

1.代码实现

1.新增拦截器

@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");
    }
}

2.配置拦截器

  <!--配置自定义拦截器-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的请求进行拦截,执行结果如下图所示:

image-20220619190243593

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

2.主要事项和细节

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

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

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-06-21 21:21:07  更:2022-06-21 21:21:54 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 17:06:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码