Spring Boot不修改现有Controller校验自定义请求头,能否用Spring Security?
当然可以完全不修改现有Controller来实现这个需求!而且哪怕这个请求头和安全无关,用Spring Security也能搞定这件事,下面给你详细说说两种可行方案:
方案一:使用Spring MVC拦截器(轻量无额外依赖)
这种方式属于Spring MVC原生支持的请求拦截机制,不需要引入额外依赖,代码也很直观:
自定义拦截器类
实现HandlerInterceptor接口,在请求到达Controller之前检查请求头是否存在:@Component public class CustomHeaderCheckInterceptor implements HandlerInterceptor { // 定义需要检查的自定义请求头名称 private static final String REQUIRED_HEADER = "X-Your-Custom-Header"; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String headerValue = request.getHeader(REQUIRED_HEADER); // 判断请求头是否存在且非空 if (headerValue == null || headerValue.isBlank()) { response.setStatus(HttpServletResponse.SC_BAD_REQUEST); response.getWriter().write("Missing required request header: " + REQUIRED_HEADER); return false; // 拒绝请求,不转发到Controller } return true; // 请求头存在,继续执行原有Controller逻辑 } }注册拦截器到Spring MVC
实现WebMvcConfigurer接口,把自定义拦截器添加到拦截器链,指定拦截所有请求路径:@Configuration public class WebMvcConfig implements WebMvcConfigurer { private final CustomHeaderCheckInterceptor headerInterceptor; // 构造注入拦截器 public WebMvcConfig(CustomHeaderCheckInterceptor headerInterceptor) { this.headerInterceptor = headerInterceptor; } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(headerInterceptor) .addPathPatterns("/**"); // 拦截所有API请求 } }
这样配置后,所有请求都会先经过这个拦截器的检查,完全不需要改动现有Controller的任何代码。
方案二:使用Spring Security实现(适合已集成Security的项目)
虽然你的请求头和安全无关,但Spring Security的过滤器链天然适合做这类全局请求校验。如果你的项目已经在用Spring Security,或者需要和其他安全规则结合,这种方式也很合适:
@Configuration @EnableWebSecurity public class SecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http // REST API场景下通常关闭CSRF防护 .csrf(csrf -> csrf.disable()) .authorizeHttpRequests(auth -> auth // 对所有请求校验是否存在指定请求头 .anyRequest().access("hasHeader('X-Your-Custom-Header')") ); return http.build(); } }
这里用了Spring Security的SpEL表达式hasHeader()来检查请求头,没有携带指定头的请求会被直接拒绝,返回403状态码;符合条件的请求会正常转发到原有Controller处理,同样不需要修改任何Controller代码。
两种方案对比
- 如果你没有使用Spring Security,优先选拦截器方案,更轻量,不需要引入额外依赖。
- 如果已经集成了Spring Security,用Security方案更方便,可以和其他安全规则(比如权限校验、JWT验证等)统一管理。
内容的提问来源于stack exchange,提问作者georgeM
相关产品推荐
相关产品推荐

