springboot中server.main.web-application-type=reactive导致的拦截器不生效

1、问题

今天写了在springboot项目中写了一个拦截器但是不生效,代码中拦截器implements HandlerInterceptor,同时implements WebMvcConfigurer中将该拦截器添加进去了,但是打断点进不去,也就意味着代码没有生效

java 复制代码
@Data
@Component
@ConfigurationProperties(prefix = "myapp")
public class WhiteIpProperties {
	private List<String> allowedIps;
}

IpAddressInterceptor

java 复制代码
/**
 * 定义拦截器以及执行时候的业务代码
 */
@Slf4j
@Component
public class IpAddressInterceptor implements HandlerInterceptor {

    @Autowired
    private WhiteIpProperties whiteIpProperties;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String ipAddress = request.getRemoteAddr();
        List<String> allowedIps = whiteIpProperties.getAllowedIps();
        if (allowedIps.contains(ipAddress)) {
            return true;
        } else {
            log.info("该ip不在访问的白名单中:{}", ipAddress);
            response.sendError(HttpServletResponse.SC_FORBIDDEN);
            return false;
        }
    }
}

WebMvcConfig

java 复制代码
/**
 * 用于注册拦截器
 */
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Autowired
    private IpAddressInterceptor ipAddressInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(ipAddressInterceptor)
                .addPathPatterns("/api/video/**", "/api/img/**")
                .excludePathPatterns("/error");
    }
}

2、定位原因

yml 复制代码
spring:
  main:
    web-application-type: reactive

问了下ai

那就按照ai提示的重新写代码


3、修改后正确代码

将上面的WebMvcConfig、WebMvcConfig删除掉重写,
下面是修改后的正确的代码,因为我是只有一个就直接这样写了,后面有扩展多个的情况

java 复制代码
import com.cao.config.WhiteIpProperties;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebFilter;
import org.springframework.web.server.WebFilterChain;
import reactor.core.publisher.Mono;

import java.util.List;

@Slf4j
@Component
public class IpAddressFilter implements WebFilter {

    @Autowired
    private WhiteIpProperties whiteIpProperties;

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
        String reqestIp = exchange.getRequest().getRemoteAddress().getHostName();
        List<String> allowedIps = whiteIpProperties.getAllowedIps();
        // 判断请求ip是否在白名单中
        if (allowedIps.contains(reqestIp)) {
            // 允许访问
            return chain.filter(exchange);
        } else {
            // 拒绝访问
            log.info("该ip不在访问的白名单中:{}", reqestIp);
            exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);
            return exchange.getResponse().writeWith(
                    Mono.just(exchange.getResponse().bufferFactory().wrap("该ip不在访问的白名单中".getBytes()))
            );
        }
    }
}

调用后打断点进去入代码中,所以代码是生效的,同时要实现的拦截器的功能也测试是OK了。

4、扩展

因为我是只需要一个,如果有多个的话,就按照这个格式写

方式1:

方式2:

相关推荐
952361 小时前
MyBatis
后端·spring·mybatis
FQNmxDG4S3 小时前
Java多线程编程:Thread与Runnable的并发控制
java·开发语言
虹科网络安全4 小时前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库
axng pmje4 小时前
Java语法进阶
java·开发语言·jvm
uzong4 小时前
9 种 RAG 架构,每位 AI 开发者必学:完整实战指南
后端
HackTorjan4 小时前
深度神经网络的反向传播与梯度优化原理
人工智能·spring boot·神经网络·机器学习·dnn
rKWP8gKv74 小时前
Java微服务性能监控:Prometheus与Grafana集成方案
java·微服务·prometheus
老前端的功夫4 小时前
【Java从入门到入土】28:Stream API:告别for循环的新时代
java·开发语言·python
qq_435287924 小时前
第9章 夸父逐日与后羿射日:死循环与进程终止?十个太阳同时值班的并行冲突
java·开发语言·git·死循环·进程终止·并行冲突·夸父逐日
小江的记录本4 小时前
【Kafka核心】架构模型:Producer、Broker、Consumer、Consumer Group、Topic、Partition、Replica
java·数据库·分布式·后端·搜索引擎·架构·kafka