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




