使用Spring验证框架验证请求标头

问题描述 投票:3回答:2

是否可以将Spring验证框架与Spring MVC一起使用来验证HTTP请求标头的存在和值?

spring validation spring-mvc bean-validation
2个回答
1
投票

要检查是否存在请求标头,您不需要验证框架。默认情况下,请求标头参数是必需的,如果请求中缺少必需的标头,则Spring MVC会自动响应400 Bad Request。

因此,以下代码自动检查标题“Header-Name”的存在...

@PostMapping("/action")
public ResponseEntity<String> doAction(@RequestHeader("Header-Name") String headerValue) {
    // ...
}

...如果标题是可选的,则注释需要替换为:

@RequestHeader(name = "Header-Name", required = false)

要检查请求标头的值,可以使用Spring验证框架。要做到这一点,你需要

  1. @Validated添加到控制器类。这是在this feature实施之前需要的解决方法。
  2. 将JSR-303注释添加到请求标头参数,例如 @RequestHeader("Header-Name") @Pattern(regexp = "[A-Za-z]*") String headerValue

但请注意,如果标头值无效,则会产生500。检查this question如何获得这种情况下的正确状态代码(即400)。


4
投票

我不知道这是怎么可能的,因为验证框架只对您的域对象进行操作,而不是对HTTP请求本身进行操作。具体来说,the Validator interface没有指定任何采用HttpServletRequest对象的方法,这是您需要访问以获取标头并测试它们的方法。

对于您尝试解决的任何问题,使用验证框架感觉就像是错误的解决方案,尤其是因为很难知道给定表单提交的唯一HTTP请求标头是如何的。您是否希望测试应用程序中始终存在的HTTP标头?然后你可能想要考虑实现一个HandlerInterceptor,它将拦截并处理你在任何HanderMappings中映射的页面的所有请求。您是否希望测试应该始终存在于应用的任何页面视图中的HTTP标头?然后你想要实现一个Filter,它在Spring MVC的上下文之外运行。

© www.soinside.com 2019 - 2024. All rights reserved.