You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Spring Boot中如何通过@GetMapping注解排除指定路径?

如何在Spring Boot控制器中排除特定路径

嘿,刚好之前我也碰到过类似的需求,Spring Boot底层依赖的Spring MVC并没有给@GetMapping直接提供exclude属性,但我们有几种很实用的方式来实现你要的效果,给你梳理下:

方法一:利用精确路径优先匹配(最简单)

Spring MVC的请求匹配规则是精确路径优先级高于通配符路径,所以我们可以专门写一个处理/exclude_path的方法,让它先被匹配到,从而跳过通配符的控制器方法。

代码示例:

import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class IndexController {
    // 精确匹配/exclude_path,这里可以返回你需要的响应(比如404或者特定内容)
    @GetMapping("/exclude_path")
    public ResponseEntity<String> handleExcludedPath() {
        // 示例:返回404,表示该路径不提供服务
        return ResponseEntity.notFound().build();
    }

    // 处理所有其他顶级路径
    @GetMapping("/*")
    public ResponseEntity<String> handleIndex() {
        // 你的业务逻辑
        return ResponseEntity.ok("Hello from index controller");
    }
}

当请求/exclude_path时,Spring会优先匹配第一个方法,不会进入通配符的handleIndex,完美实现排除效果。这种方式适合只排除少量路径的场景,简单直观。

方法二:使用路径匹配的否定表达式

Spring的Ant风格路径匹配支持用!来表示否定,我们可以直接在@GetMapping的路径数组中加入否定规则:

import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class IndexController {
    // 匹配所有顶级路径,但排除/exclude_path
    @GetMapping(value = {"/*", "!/exclude_path"})
    public ResponseEntity<String> handleIndex() {
        // 你的业务逻辑
        return ResponseEntity.ok("Hello from index controller");
    }
}

这种方式更贴近你想要的“include/exclude”写法,注意要确保Spring版本支持这种否定语法(Spring 4.3+都支持)。

方法三:用拦截器实现复杂排除逻辑

如果需要排除的路径很多,或者有更复杂的排除规则(比如根据请求参数、请求头判断),可以用Spring的HandlerInterceptor来拦截特定路径:

第一步:创建拦截器

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;

public class ExcludePathInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String requestURI = request.getRequestURI();
        // 这里可以添加更多排除规则
        if ("/exclude_path".equals(requestURI)) {
            // 直接返回响应,阻止进入控制器方法
            response.setStatus(HttpServletResponse.SC_NOT_FOUND);
            return false;
        }
        return true; // 允许其他请求进入控制器
    }
}

第二步:注册拦截器到Spring Boot

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new ExcludePathInterceptor())
                .addPathPatterns("/*"); // 只对顶级路径生效
    }
}

这种方式灵活性最高,适合复杂的排除场景。

内容的提问来源于stack exchange,提问作者Alykoff Gali

火山引擎 最新活动