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环境搭建之MyEclipse10+jdk1.8+tomcat8环境搭建详解

    JAVA环境搭建之MyEclipse10+jdk1.8+tomcat8环境搭建详解 本文将为初学者详细讲解如何在Windows操作系统上搭建MyEclipse10+jdk1.8+tomcat8环境,使得能够愉快地进行JAVA程序开发。 1. 准备工作 在进行环境搭建之前,需要确保系统中已经安装好了以下软件: JDK1.8及以上版本 Tomcat8及以上版本 …

    Java 2023年5月19日
    00
  • Spring Boot Logging Level设置为off时的Bug

    为了更好的解释“Spring Boot Logging Level设置为off时的Bug”问题以及解决方案,我们需要先了解以下几个问题: 什么是Logging Level Spring Boot默认的Logging Level设置 Logging Level为off时会出现什么问题 如何避免Logging Level为off导致的问题 现在我们按照这个顺序来…

    Java 2023年5月20日
    00
  • python实现数独算法实例

    python实现数独算法实例 介绍 数独是一种流行的逻辑游戏,也是计算机科学中常见的算法和数据结构问题。本文将介绍基于python实现数独算法的完整攻略。 算法原理 数独算法的原理可以归纳为两部分: 约束传播(Constraint Propagation)——基于已知的数推断未知的数; 回溯(Backtracking)——在没有更多的约束传播时,回溯到之前的…

    Java 2023年5月30日
    00
  • Java中session存储Users对象实现记住密码

    当我们使用Java web开发时,常使用session来存储用户的信息以便在整个会话期间使用。如果想要实现记住密码功能,则需要将用户的用户名与密码存储在session对象中,并设置session的有效时间。下面是实现过程的完整攻略。 第一步:创建一个登录页面 首先我们需要创建一个登录页面,该页面包含一个用户名和密码的输入框以及一个“记住密码”的复选框。当用户…

    Java 2023年5月20日
    00
  • 原来这就是所谓的 JSR!

    相信大家在学习 Java 的过程中,或多或少都见过 JSR 这个词。本篇文章就科普下什么是 JSR。 什么是 JSR ? JSR(Java Specification Requests),是指 Java 规范请求(或者活规范提案)。这个请求(提案)是提给 JCP 的(Java Community Process)。那什么是 JCP 呢? JCP 官网在这:h…

    Java 2023年4月22日
    00
  • java实现动态数组

    下面是关于Java实现动态数组的完整攻略: 什么是动态数组? 动态数组,简称为ArrayList,是在Java中使用较为广泛的数据结构之一。它是一种可变数组,可以根据需要自动扩展数组的大小。与传统的数组不同,动态数组的大小是可以根据需求动态增长或者缩小的。 Java中动态数组的实现 在Java中,动态数组的实现是通过内部维护一个Object数组来实现。当需要…

    Java 2023年5月26日
    00
  • Java基础之反射详解

    Java基础之反射详解 简介 反射(Reflection)是Java语言的重要特性之一,可以在运行时获取一个类的构造方法、成员变量、方法等信息。反射使得Java编写的代码具有更强的灵活性和可扩展性。 反射的基本应用 获取Class对象 获取一个类的Class对象,可以使用以下三种方式: 调用类的静态变量class。 使用对象的getClass()方法。 使用…

    Java 2023年5月26日
    00
  • Spring Boot项目利用Redis实现集中式缓存实例

    让我来详细讲解Spring Boot项目如何利用Redis实现集中式缓存实例。 什么是Redis Redis是一个开源,高性能的非关系型内存数据库,可用于存储键值对、列表、集合、有序集合等数据类型。Redis支持多种数据结构和高级功能,例如事务、Pub/Sub和Lua脚本等。 Spring Boot中使用Redis Spring Boot对Redis提供了完…

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