SpringBoot2.7.18拦截器失效不起作用

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
简介: 本文记录了作者在配置Spring Boot项目中的拦截器时遇到的问题。通过复制和修改其他项目的拦截器代码,但发现拦截器始终不生效。最终发现问题出在`WebConfig.java`中配置路径模式的方式上,即在已设置`context-path`的情况下,不应再使用`addPathPatterns(contextPath + "/**")`。文章提供了详细的配置文件和代码示例,帮助读者理解并避免类似问题。

这几天在做项目,从其他项目中复制粘贴拦截器的代码,然后修修改改,但是拦截器一直不起作用,请求来了进不去,最后发现是我写错了,代码如下: 配置文件: application.yml

yml

代码解读

复制代码

server:
  port: 8080
  servlet:
    context-path: /api/v1

#springboot的配置
spring:
  datasource: #定义数据源
    #127.0.0.1为本机测试的ip,3306是mysql的端口号。serverTimezone是定义时区,照抄就好,mysql高版本需要定义这些东西
    #useSSL也是某些高版本mysql需要问有没有用SSL连接
    url: jdbc:mysql://127.0.0.1:3306/testdb?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Hongkong&useAffectedRows=true
    username: root  #数据库用户名,root为管理员
    password: 12345678 #该数据库用户的密码
    # 使用druid数据源
    type: com.alibaba.druid.pool.DruidDataSource
  thymeleaf:
    encoding: UTF-8  #编码规范 默认
    cache: false #开发阶段建议关闭缓存
    prefix: classpath:/templates/
    suffix: .html
    mode: LEGACYHTML5 #用非严格的HTML5 默认是HTML5
    servlet:
      content-type: text/html

# mybatis-plus相关配置
mybatis-plus:
  # xml扫描,多个目录用逗号或者分号分隔(告诉 Mapper 所对应的 XML 文件位置)
  mapper-locations: classpath:mapper/*.xml
  # 以下配置均有默认值,可以不设置
  global-config:
    db-config:
      #主键类型 AUTO:"数据库ID自增" INPUT:"用户输入ID",ID_WORKER:"全局唯一ID (数字类型唯一ID)", UUID:"全局唯一ID UUID";
      id-type: auto
      #字段策略 IGNORED:"忽略判断"  NOT_NULL:"非 NULL 判断")  NOT_EMPTY:"非空判断"
      field-strategy: NOT_EMPTY
      #数据库类型
      db-type: MYSQL
  configuration:
    # 是否开启自动驼峰命名规则映射:从数据库列名到Java属性驼峰命名的类似映射
    map-underscore-to-camel-case: true
    # 如果查询结果中包含空值的列,则 MyBatis 在映射的时候,不会映射这个字段
    call-setters-on-nulls: true
    # 这个配置会将执行的sql打印出来,在开发或测试的时候可以用
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

# 日志配置
logging:
  group:
    tomcat:
      - org.apache.catalina
      - org.apache.coyote
      - org.apache.tomcat
  # pre-defined
  level:
    tomcat: INFO
    web: DEBUG
    sql: DEBUG

WebConfig.java

java

代码解读

复制代码

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * 拦截器
 */
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private RequestHandlerInterceptor requestHandlerInterceptor;

    @Value("${server.servlet.context-path}")
    private String contextPath;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(requestHandlerInterceptor)
                // 需要排除contextPath的值
                .addPathPatterns(contextPath + "/**") // 即/api/v1/**
                .excludePathPatterns(Consts.EXCLUDE_PATH_PATTERNS);
    }
}

RequestHandlerInterceptor.java

java

代码解读

复制代码

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Arrays;

/**
 * @Author SingleKey
 * @Date 2024/7/28 8:27
 */
@Component
public class RequestHandlerInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException, IOException {
        System.out.println("\n-------- RequestHandlerInterceptor.preHandle --- ");
        return false;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("\n-------- RequestHandlerInterceptor.postHandle --- ");


    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("\n-------- RequestHandlerInterceptor.afterCompletion --- ");
    }
}

乍一看好像没有问题,错误的地方是WebConfig.java的addPathPatterns(contextPath + "/**")这段代码,如果在配置文件中设置了context-path,那就不能再在这么写:addPathPatterns(contextPath + "/**"),不然将永远匹配不到,其实也是自己debug能力的欠缺,以及对SpringBoot的不够熟悉导致的,今日记下这个问题,供大家参考。

yaml

代码解读

复制代码

server:
  port: 8080
  servlet:
    context-path: /api/v1


转载来源:https://juejin.cn/post/7398503284074889253

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
10月前
|
Java 数据库
SpringBoot中如何在过滤器中取get的参数值
SpringBoot中如何在过滤器中取get的参数值
222 0
|
2月前
|
缓存 Java 数据库
SpringBoot缓存注解使用
Spring Boot 提供了一套方便的缓存注解,用于简化缓存管理。通过 `@Cacheable`、`@CachePut`、`@CacheEvict` 和 `@Caching` 等注解,开发者可以轻松地实现方法级别的缓存操作,从而提升应用的性能和响应速度。合理使用这些注解可以大大减少数据库的访问频率,优化系统性能。
188 89
|
3天前
|
缓存 Java 关系型数据库
springboot事务-失效的情况
本文总结了常见的事务失效情况及解决方法,主要包括: 1. **事务注解失效**:`@Transaction`必须作用于`public`方法,且需被Spring容器管理。 2. **数据库引擎问题**:MyISAM不支持事务,应使用InnoDB。 3. **异常处理不当**:异常被捕获未抛出或不在默认捕获范围内。 4. **传播行为设置**:如设置为`Propagation.NOT_SUPPORTED`或`Propagation.REQUIRES_NEW`可能导致事务失效。 5. **类内方法调用**:同一类中方法调用导致事务失效,需通过代理类或其他方式解决。
|
4月前
|
Java
SpringBoot 内部方法调用,事务不起作用的原因及解决办法
在做业务开发时,遇到了一个事务不起作用的问题。大概流程是这样的,方法内部的定时任务调用了一个带事务的方法,失败后事务没有回滚。查阅资料后,问题得到解决,记录下来分享给大家。
249 4
|
10月前
|
存储 Java
SpringBoot中过滤器如何设置执行顺序
SpringBoot中过滤器如何设置执行顺序
928 0
|
前端开发 Java 数据安全/隐私保护
SpringBoot2.0(过滤器,监听器,拦截器)
SpringBoot2.0(过滤器,监听器,拦截器)
|
缓存 前端开发 安全
SpringBoot如何缓存方法返回值?
为什么要对方法的返回值进行缓存呢? 简单来说是为了提升后端程序的性能和提高前端程序的访问速度。减小对db和后端应用程序的压力。 一般而言,缓存的内容都是不经常变化的,或者轻微变化对于前端应用程序是可以容忍的。 否则,不建议加入缓存,因为增加缓存会使程序复杂度增加,还会出现一些其他的问题,比如缓存同步,数据一致性,更甚者,可能出现经典的缓存穿透、缓存击穿、缓存雪崩问题。
80 0
|
NoSQL Java Redis
SpringBoot启动时如何对配置文件进行校验?这种方法才叫优雅!(文末福利)
SpringBoot启动时如何对配置文件进行校验?这种方法才叫优雅!(文末福利)
193 0
|
存储 缓存 Java
Springboot中基于注解使用缓存
Springboot中基于注解使用缓存
186 0
ssm-事务--使用配置文件方式进行配置,使用注解进行使用
ssm-事务--使用配置文件方式进行配置,使用注解进行使用