广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >SpringMVC的拦截器(Interceptor)
  • 200
分享到

SpringMVC的拦截器(Interceptor)

tomcatjavaservlet 2023-09-10 19:09:47 200人浏览 薄情痞子
摘要

文章目录 1 拦截器概念2 拦截器入门案例2.1 环境准备2.2 拦截器开发步骤1:创建拦截器类步骤2:配置拦截器类步骤3:SpringMVC添加SpringMvcSupport包扫描步骤4:

文章目录

对于拦截器这节的知识,我们需要学习如下内容:

  • 拦截器概念
  • 入门案例
  • 拦截器参数
  • 拦截器工作流程分析

1 拦截器概念

讲解拦截器的概念之前,我们先看一张图:

1630676280170

(1)浏览器发送一个请求会先到TomcatWEB服务器

(2)Tomcat服务器接收到请求以后,会去判断请求的是静态资源还是动态资源

(3)如果是静态资源,会直接到Tomcat的项目部署目录下去直接访问

(4)如果是动态资源,就需要交给项目的后台代码进行处理

(5)在找到具体的方法之前,我们可以去配置过滤器(可以配置多个),按照顺序进行执行

(6)然后进入到到中央处理器(springMVC中的内容),springmvc会根据配置的规则进行拦截

(7)如果满足规则,则进行处理,找到其对应的controller类中的方法进行执行,完成后返回结果

(8)如果不满足规则,则不进行处理

(9)这个时候,如果我们需要在每个Controller方法执行的前后添加业务,具体该如何来实现?

这个就是拦截器要做的事。

  • 拦截器(Interceptor)是一种动态拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行
  • 作用:
    • 在指定的方法调用前后执行预先设定的代码
    • 阻止原始方法的执行
    • 总结:拦截器就是用来做增强

看完以后,大家会发现

  • 拦截器和过滤器在作用和执行顺序上也很相似

所以这个时候,就有一个问题需要思考:拦截器和过滤器之间的区别是什么?

  • 归属不同:Filter属于Servlet技术,Interceptor属于SpringMVC技术
  • 拦截内容不同:Filter对所有访问进行增强,Interceptor仅针对SpringMVC的访问进行增强

1630676903190

2 拦截器入门案例

2.1 环境准备

Masked5 / heima_springmvc_codes · GitCode

  • 创建一个Web的Maven项目

  • pom.xml添加SSM整合所需jar

    <project xmlns="Http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  <modelVersion>4.0.0modelVersion>  <groupId>com.itheimagroupId>  <artifactId>springmvc_12_interceptorartifactId>  <version>1.0-SNAPSHOTversion>  <packaging>warpackaging>  <dependencies>    <dependency>      <groupId>javax.servletgroupId>      <artifactId>javax.servlet-apiartifactId>      <version>3.1.0version>      <scope>providedscope>    dependency>    <dependency>      <groupId>org.springframeworkgroupId>      <artifactId>spring-webmvcartifactId>      <version>5.2.10.RELEASEversion>    dependency>    <dependency>      <groupId>com.fasterxml.jackson.coregroupId>      <artifactId>jackson-databindartifactId>      <version>2.9.0version>    dependency>  dependencies>  <build>    <plugins>      <plugin>        <groupId>org.apache.tomcat.mavengroupId>        <artifactId>tomcat7-maven-pluginartifactId>        <version>2.1version>        <configuration>          <port>80port>          <path>/path>        configuration>      plugin>        <plugin>            <groupId>org.apache.maven.pluginsgroupId>            <artifactId>maven-compiler-pluginartifactId>            <configuration>                <source>8source>                <target>8target>            configuration>        plugin>    plugins>  build>project>
  • 创建对应的配置类

    public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {    protected Class<?>[] getRootConfiGClasses() {        return new Class[0];    }    protected Class<?>[] getServletConfigClasses() {        return new Class[]{SpringMvcConfig.class};    }    protected String[] getServletMappings() {        return new String[]{"/"};    }    //乱码处理    @Override    protected Filter[] getServletFilters() {        CharacterEncodingFilter filter = new CharacterEncodingFilter();        filter.setEncoding("UTF-8");        return new Filter[]{filter};    }}@Configuration@ComponentScan({"com.itheima.controller"})@EnableWebMvcpublic class SpringMvcConfig{   }
  • 创建模型类Book

    public class Book {    private String name;    private double price;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public double getPrice() {        return price;    }    public void setPrice(double price) {        this.price = price;    }    @Override    public String toString() {        return "Book{" +                "书名='" + name + '\'' +                ", 价格=" + price +                '}';    }}
  • 编写Controller

    @RestController@RequestMapping("/books")public class BookController {    @PostMapping    public String save(@RequestBody Book book){        System.out.println("book save..." + book);        return "{'module':'book save'}";    }    @DeleteMapping("/{id}")    public String delete(@PathVariable Integer id){        System.out.println("book delete..." + id);        return "{'module':'book delete'}";    }    @PutMapping    public String update(@RequestBody Book book){        System.out.println("book update..."+book);        return "{'module':'book update'}";    }    @GetMapping("/{id}")    public String getById(@PathVariable Integer id){        System.out.println("book getById..."+id);        return "{'module':'book getById'}";    }    @GetMapping    public String getAll(){        System.out.println("book getAll...");        return "{'module':'book getAll'}";    }}

最终创建好的项目结构如下:

Masked5 / heima_springmvc_codes · GitCode

1630677370998

2.2 拦截器开发

步骤1:创建拦截器类

让类实现HandlerInterceptor接口,重写接口中的三个方法。

@Component//定义拦截器类,实现HandlerInterceptor接口//注意当前类必须受Spring容器控制public class ProjectInterceptor implements HandlerInterceptor {    @Override    //原始方法调用前执行的内容    public boolean preHandle(httpservletRequest request, HttpServletResponse response, Object handler) throws Exception {        System.out.println("preHandle...");        return true;    }    @Override    //原始方法调用后执行的内容    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {        System.out.println("postHandle...");    }    @Override    //原始方法调用完成后执行的内容    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {        System.out.println("afterCompletion...");    }}

**注意:**拦截器类要被SpringMVC容器扫描到。

步骤2:配置拦截器类
@Configurationpublic class SpringMvcSupport extends WebMvcConfigurationSupport {    @Autowired    private ProjectInterceptor projectInterceptor;    @Override    protected void addResourceHandlers(ResourceHandlerReGIStry registry) {        registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");    }    @Override    protected void addInterceptors(InterceptorRegistry registry) {        //配置拦截器        registry.addInterceptor(projectInterceptor).addPathPatterns("/books" );    }}
步骤3:SpringMVC添加SpringMvcSupport包扫描
@Configuration@ComponentScan({"com.itheima.controller","com.itheima.config"})@EnableWebMvcpublic class SpringMvcConfig{   }
步骤4:运行程序测试

使用PostMan发送http://localhost/books

1630678114224

如果发送http://localhost/books/100会发现拦截器没有被执行,原因是拦截器的addPathPatterns方法配置的拦截路径是/books,我们现在发送的是/books/100,所以没有匹配上,因此没有拦截,拦截器就不会执行。

步骤5:修改拦截器拦截规则
@Configurationpublic class SpringMvcSupport extends WebMvcConfigurationSupport {    @Autowired    private ProjectInterceptor projectInterceptor;    @Override    protected void addResourceHandlers(ResourceHandlerRegistry registry) {        registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");    }    @Override    protected void addInterceptors(InterceptorRegistry registry) {        //配置拦截器        registry.addInterceptor(projectInterceptor).addPathPatterns("/books","/books/*" );    }}

这个时候,如果再次访问http://localhost/books/100,拦截器就会被执行。

最后说一件事,就是拦截器中的preHandler方法,如果返回true,则代表放行,会执行原始Controller类中要请求的方法,如果返回false,则代表拦截,后面的就不会再执行了。

步骤6:简化SpringMvcSupport的编写
@Configuration@ComponentScan({"com.itheima.controller"})@EnableWebMvc//实现WebMvcConfigurer接口可以简化开发,但具有一定的侵入性public class SpringMvcConfig implements WebMvcConfigurer {    @Autowired    private ProjectInterceptor projectInterceptor;    @Override    public void addInterceptors(InterceptorRegistry registry) {        //配置多拦截器        registry.addInterceptor(projectInterceptor).addPathPatterns("/books","/books/*");    }}

此后咱们就不用再写SpringMvcSupport类了。

最后我们来看下拦截器的执行流程:

1630679464294

当有拦截器后,请求会先进入preHandle方法,

​ 如果方法返回true,则放行继续执行后面的handle[controller的方法]和后面的方法

​ 如果返回false,则直接跳过后面方法的执行。

3 拦截器参数

3.1 前置处理方法

原始方法之前运行preHandle

public boolean preHandle(HttpServletRequest request,                         HttpServletResponse response,                         Object handler) throws Exception {    System.out.println("preHandle");    return true;}
  • request:请求对象
  • response:响应对象
  • handler:被调用的处理器对象,本质上是一个方法对象,对反射中的Method对象进行了再包装

使用request对象可以获取请求数据中的内容,如获取请求头的Content-Type

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {    String contentType = request.getHeader("Content-Type");    System.out.println("preHandle..."+contentType);    return true;}

使用handler参数,可以获取方法的相关信息

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {    HandlerMethod hm = (HandlerMethod)handler;    String methodName = hm.getMethod().getName();//可以获取方法的名称    System.out.println("preHandle..."+methodName);    return true;}

3.2 后置处理方法

原始方法运行后运行,如果原始方法被拦截,则不执行

public void postHandle(HttpServletRequest request,                       HttpServletResponse response,                       Object handler,                       ModelAndView modelAndView) throws Exception {    System.out.println("postHandle");}

前三个参数和上面的是一致的。

modelAndView:如果处理器执行完成具有返回结果,可以读取到对应数据与页面信息,并进行调整

因为咱们现在都是返回JSON数据,所以该参数的使用率不高。

3.3 完成处理方法

拦截器最后执行的方法,无论原始方法是否执行

public void afterCompletion(HttpServletRequest request,HttpServletResponse response,Object handler,Exception ex) throws Exception {    System.out.println("afterCompletion");}

前三个参数与上面的是一致的。

ex:如果处理器执行过程中出现异常对象,可以针对异常情况进行单独处理

因为我们现在已经有全局异常处理器类,所以该参数的使用率也不高。

这三个方法中,最常用的是preHandle,在这个方法中可以通过返回值来决定是否要进行放行,我们可以把业务逻辑放在该方法中,如果满足业务则返回true放行,不满足则返回false拦截。

4 拦截器链配置

目前,我们在项目中只添加了一个拦截器,如果有多个,该如何配置?配置多个后,执行顺序是什么?

4.1 配置多个拦截器

步骤1:创建拦截器类

实现接口,并重写接口中的方法

@Componentpublic class ProjectInterceptor2 implements HandlerInterceptor {    @Override    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {        System.out.println("preHandle...222");        return false;    }    @Override    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {        System.out.println("postHandle...222");    }    @Override    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {        System.out.println("afterCompletion...222");    }}
步骤2:配置拦截器类
@Configuration@ComponentScan({"com.itheima.controller"})@EnableWebMvc//实现WebMvcConfigurer接口可以简化开发,但具有一定的侵入性public class SpringMvcConfig implements WebMvcConfigurer {    @Autowired    private ProjectInterceptor projectInterceptor;    @Autowired    private ProjectInterceptor2 projectInterceptor2;    @Override    public void addInterceptors(InterceptorRegistry registry) {        //配置多拦截器        registry.addInterceptor(projectInterceptor).addPathPatterns("/books","/books/*");        registry.addInterceptor(projectInterceptor2).addPathPatterns("/books","/books/*");    }}

步骤3:运行程序,观察顺序

1630680435269

拦截器执行的顺序是和配置顺序有关。就和前面所提到的运维人员进入机房的案例,先进后出。

  • 当配置多个拦截器时,形成拦截器链
  • 拦截器链的运行顺序参照拦截器添加顺序为准
  • 当拦截器中出现对原始处理器的拦截,后面的拦截器均终止运行
  • 当拦截器运行中断,仅运行配置在前面的拦截器的afterCompletion操作

1630680579735

preHandle:与配置顺序相同,必定运行

postHandle:与配置顺序相反,可能不运行

afterCompletion:与配置顺序相反,可能不运行。

这个顺序不太好记,最终只需要把握住一个原则即可:以最终的运行结果为准

来源地址:https://blog.csdn.net/Drifter_Galaxy/article/details/130754601

--结束END--

本文标题: SpringMVC的拦截器(Interceptor)

本文链接: https://www.lsjlt.com/news/402536.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • SpringMVC的拦截器(Interceptor)
    文章目录 1 拦截器概念2 拦截器入门案例2.1 环境准备2.2 拦截器开发步骤1:创建拦截器类步骤2:配置拦截器类步骤3:SpringMVC添加SpringMvcSupport包扫描步骤4:...
    99+
    2023-09-10
    tomcat java servlet
  • SpringMVC拦截器
    7.SpringMVC拦截器 7.1-SpringMVC拦截器-拦截器的作用(理解) Spring MVC 的拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理。 将拦截器按一定的顺序联结成一条链,这...
    99+
    2023-08-19
    java servlet spring
  • Java 实现拦截器Interceptor的拦截功能方式
    目录第1步:创建业务组件接口 BusinessFacade第2步:创建业务组件实现类 BusinessClass第3步:创建拦截器 InterceptorClass第4步:创建动态代...
    99+
    2022-11-12
  • SpringBoot使用Interceptor拦截器的实例
    在springboot中使用拦截器也比较简单,实现HandlerInterceptor或者AsyncHandlerInterceptor接口,再从配置里添加一下拦截器就完成了; As...
    99+
    2023-03-19
    SpringBoot使用Interceptor拦截器 SpringBoot拦截器
  • vue-resource拦截器interceptor怎么用
    这篇文章主要介绍了vue-resource拦截器interceptor怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。拦截器-inter...
    99+
    2022-10-19
  • SpringBoot怎么使用Interceptor拦截器
    这篇文章主要讲解了“SpringBoot怎么使用Interceptor拦截器”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringBoot怎么使用Interceptor拦截器”吧!在sp...
    99+
    2023-07-05
  • SpringMVC拦截器详解
    目录web.xml文件springMVC配置文件:controller类:第一个拦截器配置:第二个拦截器:总结web.xml文件 <?xml version="1....
    99+
    2022-11-12
  • springboot Interceptor拦截器excludePathPatterns忽略失效
    springboot Interceptor拦截器excludePathPatterns忽略失效 excludePathPatterns方法是排除访问路径,但是当你排除的url路径在...
    99+
    2022-11-12
  • Java实现拦截器Interceptor的拦截功能方式是怎么样的
    本篇文章为大家展示了Java实现拦截器Interceptor的拦截功能方式是怎么样的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Java 里的拦截器是动态拦截 action 调用的对象,它提供了一...
    99+
    2023-06-25
  • SpringMVC中拦截器的实现
    SpringMVC 中的 Interceptor 拦截器是非常重要和相当有用的,它的主要作用是拦截指定的用户请求,并进行相应的预处理与后处理。其拦截的时间点在“处理器映射...
    99+
    2022-11-13
  • 详解SpringMVC的拦截器参数及拦截器链配置
    目录一、拦截器参数二、拦截器链配置一、拦截器参数 前置处理 public boolean preHandle(HttpServletRequest request, HttpServ...
    99+
    2022-11-13
  • springmvc实现简单的拦截器
    SpringMVC 中的Interceptor 拦截请求是通过HandlerInterceptor 来实现的。在SpringMVC 中定义一个Interceptor 非常简单,主要有两种方式,第一种方式是要定义的Interceptor类要实...
    99+
    2023-05-31
    springmvc 拦截器 实现简单
  • SpringMVC 拦截器的使用示例
    目录简介 拦截器初体验 拦截器再体验-登录验证 简介 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。开发者可以自己...
    99+
    2022-11-12
  • java SpringMvc中拦截器的应用
    目录什么是拦截器基本使用实例总结什么是拦截器 拦截器(Interceptor)是SpringMVC中的组件。可以使很多个请求被处理时,都会执行拦截器中的代码。拦截器可以选择阻止执行或...
    99+
    2022-11-13
  • Java的SpringMVC拦截器怎么用
    今天小编给大家分享一下Java的SpringMVC拦截器怎么用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。拦截器(inte...
    99+
    2023-06-29
  • springboot拦截器Interceptor的使用,你都了解吗
    springmvc 中的拦截器可以对请求进行判别, 在请求到达控制器之前, 把非法的请求给拦截掉 下面来说一说, 它在springboot中的使用 拦截器是可以有多个的, 对不同的 ...
    99+
    2022-11-12
  • spring boot中interceptor拦截器未生效的解决
    目录interceptor拦截器未生效开始用的spring boot版本为1.5.6解决方案HandlerInterceptor实现登录失效拦截等首先写一个实现HandlerInte...
    99+
    2022-11-12
  • 详解SpringMVC的拦截器链实现及拦截器链配置
    目录1、拦截器链实现2、拦截器链的执行顺序1、拦截器链实现 只需定义多个拦截器的 bean,然后在拦截器的配置类中将其逐一添加即可 第一个拦截器的定义: @Component pub...
    99+
    2022-11-13
  • springmvc拦截器如何实现
    Spring MVC拦截器可以通过实现HandlerInterceptor接口来实现。具体步骤如下:1. 创建一个类实现Handle...
    99+
    2023-09-14
    springmvc
  • SpringMVC拦截器怎么使用
    今天小编给大家分享一下SpringMVC拦截器怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。SpringMVC 的拦...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作