spring boot 2.x静态资源会被拦截器拦截的原因分析及解决

一、问题描述

在使用Spring Boot 2.x开发项目时,我们可能会遇到一个问题,即静态资源(如CSS、JS、图片等)会被拦截器拦截而无法正常加载导致页面样式、交互等异常。这是因为Spring Boot 2.x采用了不同于之前版本的WebMvcConfigurerAdapter配置方式,在配置拦截器时需要特别注意。

二、原因分析

在Spring Boot 1.x及早期版本中,我们可以通过继承WebMvcConfigurerAdapter类并实现addInterceptors()方法来配置拦截器,例如:

@Configuration
public class WebAppConfig extends WebMvcConfigurerAdapter {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
        super.addInterceptors(registry);
    }
}

但是在Spring Boot 2.x中,WebMvcConfigurerAdapter已经被废弃,使用官方推荐的方式需要实现WebMvcConfigurer接口,例如:

@Configuration
public class WebAppConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
        WebMvcConfigurer.super.addInterceptors(registry);
    }
}

这里需要特别注意到addInterceptors()方法的第二个参数需要传入一个路径数组,当请求路径匹配路径数组中的某个路径时才会执行拦截器。如果没有配置路径数组,拦截器将拦截所有请求,包括静态资源请求。这就是静态资源被拦截器拦截的原因。

三、解决方案

解决方案很简单,就是在匹配路径时排除静态资源路径即可。总的来说,有两种解决方案:

  1. 在addInterceptors()方法中定义路径数组时排除静态资源路径。可以使用静态资源路径的前缀来过滤静态资源请求,例如:
@Configuration
public class WebAppConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor())
                .addPathPatterns("/**")
                .excludePathPatterns("/static/**"); // 排除静态资源路径
        WebMvcConfigurer.super.addInterceptors(registry);
    }
}

这里“/static/**”是定义的静态资源路径前缀,它可以根据实际情况修改。

  1. 在WebMvcConfigurer配置类中重写addResourceHandlers()方法,手动配置静态资源路径,例如:
@Configuration
public class WebAppConfig implements WebMvcConfigurer {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**")
                .addResourceLocations("classpath:/static/");
        WebMvcConfigurer.super.addResourceHandlers(registry);
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
        WebMvcConfigurer.super.addInterceptors(registry);
    }
}

这里使用了addResourceHandlers()方法手动配置了静态资源路径,“/static/**”是静态资源访问路径,而实际的静态资源所在路径则为“classpath:/static/”(即resources/static/目录)。这种方式需要手动配置静态资源路径,但可以更加灵活地控制静态资源的访问,同时避免了静态资源被拦截器拦截的问题。

四、示例

  1. 在addInterceptors()方法中排除静态资源路径
@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**").excludePathPatterns("/static/**");
        WebMvcConfigurer.super.addInterceptors(registry);
    }
}

由于排除了"/static/**"路径,LoginInterceptor不会拦截静态资源请求。示例代码中的LoginInterceptor实现了简单的登录验证功能。

  1. 在WebMvcConfigurer配置类中手动配置静态资源路径
@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
        WebMvcConfigurer.super.addResourceHandlers(registry);
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**");
        WebMvcConfigurer.super.addInterceptors(registry);
    }
}

由于手动配置了静态资源路径,LoginInterceptor也不会拦截静态资源请求。示例代码中的LoginInterceptor实现了简单的登录验证功能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:spring boot 2.x静态资源会被拦截器拦截的原因分析及解决 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • java实现单链表中的增删改

    让我们来讲解一下Java实现单链表中的增删改的完整攻略。 一、单链表概述 单链表是一种线性数据结构,它是由若干个节点组成,每个节点包含两部分,一部分是存储数据的元素,另一部分是指向下一个节点的指针。单链表的头节点没有前驱节点,尾节点没有后继节点。 单链表常用的操作有插入、删除、修改和查询,其中插入和删除操作是单链表的核心操作。 二、Java单链表实现 下面我…

    Java 2023年5月19日
    00
  • 前台js对象在后台转化java对象的问题探讨

    前台js对象在后台转化java对象的问题探讨 当我们使用前后端分离的架构时,前台js对象与后台java对象之间需要进行转化。在这个过程中会遇到一些问题,如何解决这些问题呢?下面就来探讨一下这个问题。 第一步:前台js对象转化为后台json对象 前台js对象可以通过JSON.stringify()方法转化为json对象,具体操作如下: var jsObject…

    Java 2023年5月26日
    00
  • MVC异常处理详解

    下面是关于“MVC异常处理详解”的完整攻略,包含两个示例说明。 MVC异常处理详解 在MVC(Model-View-Controller)架构中,异常处理是一个非常重要的问题。在应用程序中,可能会发生各种各样的异常,如空指针异常、数据库异常、网络异常等等。如果不进行适当的异常处理,这些异常可能会导致应用程序崩溃或者无法正常工作。本文将详细介绍如何在MVC架构…

    Java 2023年5月17日
    00
  • Java将文件夹保留目录打包为 ZIP 压缩包并下载的教程详解

    下面是关于“Java将文件夹保留目录打包为 ZIP 压缩包并下载的教程详解”的完整攻略。 前言 在Java程序中,我们有时会需要将一个文件夹以及其中的文件打包成ZIP格式的压缩文件并下载。本文将介绍如何实现这个功能。 代码实现 Java提供了ZipOutputStream类和ZipEntry类,可以轻松地打包一个文件夹中的所有文件并生成ZIP文件。我们可以使…

    Java 2023年5月19日
    00
  • 详解Spring容器的使用流程

    下面我将给出详解Spring容器的使用流程的完整攻略。 什么是Spring容器 Spring是一个轻量级的开源框架,用于开发企业级应用程序。Spring容器是Spring最核心的部分,它提供了一个容器,用于管理应用程序中的对象,这些对象被称为Bean。 Spring容器的使用流程 Spring容器的使用包括以下几个步骤: 1. 导入Spring相关的Jar包…

    Java 2023年5月20日
    00
  • MyBatis-Plus 之selectMaps、selectObjs、selectCount、selectOne的使用

    一、MyBatis-Plus之selectMaps、selectObjs、selectCount、selectOne的使用 selectMaps MyBatis-Plus提供的selectMaps方法可以返回一个List\<Map\<String, Object>>对象,其中包含查询的结果集中的每一行记录,每一行记录都会转成一个Map…

    Java 2023年5月20日
    00
  • JavaCV摄像头实战之实现口罩检测

    JavaCV摄像头实战之实现口罩检测 简介 本攻略将介绍如何使用JavaCV以及OpenCV在Java中实现口罩检测。通过利用JavaCV调用OpenCV的相关函数实现摄像头捕获、处理以及检测口罩的功能。 准备工作 安装Java环境 确保已经安装好了Java环境,并且可以在命令行中运行。 安装JavaCV和OpenCV库 在JavaCV官网(https://…

    Java 2023年5月20日
    00
  • UniApp + SpringBoot 实现微信支付和退款功能

    UniApp 是一款跨平台的移动应用开发框架,通常可同时构建出 iOS 和 Android 应用。SpringBoot 是一款流行的 Java Web 开发框架,提供了快速搭建 web 应用的能力。通过结合起来,可以实现微信支付和退款功能。 第一步:注册微信开发者账号 如果没有微信开发者账号,需要手动注册一个。注册成功后,需要进行微信支付相关的配置,包括商户…

    Java 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部