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

目录
  • 1.什么是拦截器
  • 2.自定义拦截器执行流程图
  • 3.自定义拦截器应用实例
    • 1.快速入门
    • 2.注意事项和细节
    • 3.Debug执行流程
    • 4.多个拦截器
      • 1.多个拦截器执行流程示意图
      • 2.应用实例
      • 3.主要事项和细节

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拦截器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringMVC自定义拦截器登录检测功能的实现代码

    目录 一.定义登录控制器 二.自定义登录拦截器 一.定义登录控制器 目录结构 代码: 1.创建TUser类 package com.demo.pojo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor public class TUser { private String name;

  • SpringMVC自定义拦截器实现过程详解

    SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理.开发者可以自定义一些拦截器来实现特点的功能. 过滤器与拦截器的区别:拦截器是AOP思想的具体应用. 过滤器 servlet规范中的一部分,任何java web工程都可以使用 在url-pattern中配置了/*之后,可以对所有要访问的资源进行拦截 拦截器 拦截是SpringMVC框架自己的,只要使用SpringMVC框架的工程才能使用 拦截器只会拦截访问的控制方法,如果访问的是jsp/

  • SpringMvc自定义拦截器(注解)代码实例

    拦截器 自定义拦截器实现HandlerInterceptor接口的三个方法. public class MyInterceptor implements HandlerInterceptor{ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //拦截内容 //放行 return true;

  • Java SpringMVC实现自定义拦截器

    目录 SpringMVC实现自定义拦截器 1拦截器(interceptor)的作用 2拦截器和过滤器区别 3.实现过程 3.1创建拦截器类实现HandlerInterceptor接口 3.2配置拦截器 3.3测试拦截器的拦截效果 3.4编写jsp页面 3.5测试结果 4.拦截器链 5.知识小结 总结 SpringMVC实现自定义拦截器 1 拦截器(interceptor)的作用 Spring MVC 的拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理.

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

    目录 1.什么是拦截器 2.自定义拦截器执行流程图 3.自定义拦截器应用实例 1.快速入门 2.注意事项和细节 3.Debug执行流程 4.多个拦截器 1.多个拦截器执行流程示意图 2.应用实例 3.主要事项和细节 1.什么是拦截器 说明 Spring MVC 也可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能. 自定义的拦截器必须实现 HandlerInterceptor 接口 自定义拦截器的三个方法 preHandle():这个方法在业务处理器处理请求之前被调用,在该方

  • Java超详细讲解WebMvcConfigurer拦截器

    目录 addInterceptors拦截器 addViewControllers页面跳转 addResourceHandlers静态资源 configureViewResolvers视图解析器 addCorsMappings跨域 configureMessageConverters信息转换器 WebMvcConfigurer接口常用的方法: /* 拦截器配置 */ void addInterceptors(InterceptorRegistry var1); /* 视图跳转控制器 */ void

  • Android超详细介绍自定义多选框与点击按钮跳转界面的实现

    总程:在avtivity_main.xml设计5个控件,btn1-5,点击btn1弹出一个多选对话框,点击按钮btn1弹出一个多选框可选择你喜欢的打野英雄,点击btn2跳转到activity_main2界面(就是图片,不可选择)设计思路流程:在activity_main.xml布局界面,总体在头目录进行垂直排列,然后镶嵌5个水平的线性布局(左是ImageView,右边是Button按钮)由于5张图的大小在一个屏幕显示不出来,所以添加一个ScoveView滚动,以使所有资源可以看到! 在MainA

  • SpringMVC超详细讲解视图和视图解析器

    目录 SpringMVC-视图和视图解析器 1.基本介绍 2.自定义视图 1.为什么要自定义视图 2.自定义视图实例-代码实现 3.自定义视图工作流程小结 自定义视图-小结 自定义视图-工作流程 4.目标方法直接指定转发或重定向 1.使用实例 2.指定请求转发流程-Debug源码 3.指定重定向流程-Debug源码 SpringMVC-视图和视图解析器 1.基本介绍 在 springMVC 中的目标方法最终返回都是一个视图(有各种视图). 返回的视图都会由一个视图解析器来处理 (视图解析器有很多

  • Java SpringMVC实现自定义拦截器

    目录 SpringMVC实现自定义拦截器 1 拦截器(interceptor)的作用 2 拦截器和过滤器区别 3.实现过程 3.1创建拦截器类实现HandlerInterceptor接口 3.2配置拦截器 3.3测试拦截器的拦截效果 3.4编写jsp页面 3.5测试结果 4. 拦截器链 5. 知识小结 总结 SpringMVC实现自定义拦截器 1 拦截器(interceptor)的作用 Spring MVC 的拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后

  • Vue计算属性与侦听器和过滤器超详细介绍

    目录 1. 计算属性 1.1 使用方法 1.2 案例-购物车合计使用计算属性 2. 侦听器 3. 过滤器 1. 计算属性 1.1 使用方法 概述: 模板中放入太多的逻辑会让模板过重且难以维护,使用计算属性可以让模板变得简洁易于维护.计算属性是基于它们的响应式依赖进行缓存的,计算属性比较适合对多个变量或者对象进行处理后返回一个结果值,也就是数多个变量中的某一个值发生了变化则我们监控的这个值也就会发生变化. 计算属性定义在Vue对象中,通过关键词computed属性对象中定义一个个函数,并返回一个值

随机推荐