Spring Boot 请求标头验证

Lol*_*lly 2 java spring-validator spring-boot

我正在使用 Spring Boot 2.3.8 创建休息服务。我需要验证请求标头,以便它应该具有某些标头,否则会引发错误。这对于所有方法或服务来说应该是通用的。我在下面尝试过,

public ResponseEntity<Object> addEmployee(
        @RequestHeader(name = "header1", required = true) String header1,
        @RequestHeader(name = "header2", required = true) String header2,
        @RequestBody Employee employee) 
                 throws Exception 
    { 
Run Code Online (Sandbox Code Playgroud)

但我需要为所有控制器中的所有方法添加此内容。如果是这种情况,我如何为全局所有服务抛出“请求标头中缺少 Header1”/“请求标头中缺少 header2”之类的错误?

Pan*_*kos 5

对于全局使用,您可以注册一个拦截器。

@Component
public class MyHandlerInterceptor implements HandlerInterceptor {
    
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object object, Exception arg3) throws Exception {
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object object, ModelAndView model) throws Exception {
    }

   @Override
   public boolean preHandle(HttpServletRequest request,
   HttpServletResponse response, Object handler) throws Exception {

    
    //here check headers contained in request object
    if (request.getHeader("header1") == null || request.getHeader("header2") == null) {
      response.getWriter().write("something");
      response.setStatus(someErrorCode);

      return false;
   }

   return true;
} 
Run Code Online (Sandbox Code Playgroud)

然后注册一下

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

@Autowired
private MyHandlerInterceptor interceptor;

@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(interceptor).addPathPatterns("/**");
 }
}
Run Code Online (Sandbox Code Playgroud)