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

yizhihongxing

一、问题描述

在使用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日

相关文章

  • 基于jsp+mysql实现在线水果销售商城系统

    系统环境搭建 首先需要安装JDK和Tomcat,并进行相关配置;接着安装MySQL数据库,并在其中创建相应的数据库和表格结构。 JSP页面设计 设计网站的前端界面,包括首页、商品详情页、购物车、结算页面等,需要使用HTML、CSS、JavaScript等前端技术进行实现。 后台服务搭建 基于Java语言使用JSP技术实现后台管理服务,包括用户登录、用户注册、…

    Java 2023年6月15日
    00
  • Java springboot接口迅速上手,带你半小时极速入门

    Javaspringboot接口迅速上手,带你半小时极速入门攻略 什么是Spring Boot Spring Boot是Spring框架的扩展,使得开发者可以更加方便快捷地创建Spring Web应用和微服务应用。Spring Boot提供了很多自动化配置,通过使用Spring Boot可以快速搭建一个现代化的Web应用或者是微服务。 开始使用Spring …

    Java 2023年5月15日
    00
  • 深入了解Java核心类库–Math类

    深入了解Java核心类库–Math类 什么是Math类 Math类是Java核心类库中的一个非常重要的类,它包含了丰富的数学函数和常量定义,使得Java程序可以方便地实现数学计算和功能。Java语言自带的Math类使Java开发人员省去了自行编写一些基本的计算公式和函数的麻烦,可以更专注于核心业务的实现。 Math类中常用方法 常量定义 Math类中定义了…

    Java 2023年5月26日
    00
  • MySQL详解进行JDBC编程与增删改查方法

    MySQL详解进行JDBC编程与增删改查方法 JDBC编程 Java数据库连接(Java Database Connectivity,JDBC)是Java语言中操作关系型数据库的应用程序接口,JDBC提供了一套标准的API,用于Java程序中访问数据库。 使用JDBC连接MySQL需要以下步骤: 导入MySQL驱动 java Class.forName(“c…

    Java 2023年5月19日
    00
  • Java设计模式之java命令模式详解

    Java设计模式之Java命令模式详解,主要介绍了命令模式的定义、结构、应用场景、优缺点以及如何在Java中实现命令模式。 命令模式的定义:将一个请求封装成一个对象,从而使用户可以用不同的请求对客户端进行参数化,即可以用请求对请求分类,同时支持请求排队、记录请求日志、撤销操作等功能。 命令模式的结构:命令(Command)、具体命令(ConcreteComm…

    Java 2023年5月24日
    00
  • 【SSM】一、了解Sping 框架

    〇、Maven 0.1 什么是Maven? Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project’s build…

    Java 2023年4月25日
    00
  • JavaEE微框架Spring Boot深入解读

    JavaEE微框架SpringBoot深入解读 简介 Spring Boot是一个基于Spring框架的快速应用开发框架,它简化了Spring应用的开发过程,使用起来非常方便,而且能够快速地搭建一个可用的、生产级别的应用程序。 Spring Boot的核心特性 自动配置 在Spring Boot的自动配置下,开发者不需要再手动地为每一个框架、类库引入一个配置…

    Java 2023年5月15日
    00
  • 教你如何使用Java输出各种形状

    如何使用Java输出各种形状 本文将介绍如何使用Java语言输出多种形状,包括矩形、三角形和菱形等。通过学习本文,您将了解到Java中输出各种形状的方法及实例。 矩形 矩形是最简单的图形之一,我们可以使用Java的for循环输出一个指定宽度和高度的矩形。以下是代码示例: // 输出一个5行4列的矩形 int width = 4; int height = 5…

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