是否可以将 Spring 验证框架与 Spring MVC 一起使用来验证 HTTP 请求标头的存在和值?
2 回答
要检查请求标头的存在,您不需要验证框架。请求头参数默认是强制的,如果请求中缺少强制头,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 验证框架。为此,您需要
- 添加
@Validated
到控制器类。这是实现此功能之前需要的解决方法。 在请求头参数中添加 JSR-303 注解,例如
@RequestHeader("Header-Name") @Pattern(regexp = "[A-Za-z]*") String headerValue
但是请注意,如果标头值无效,这将导致 500。检查此问题以了解如何获得这种情况下的正确状态代码(即 400)。
我看不出这是怎么可能的,因为验证框架只对您的域对象运行,而不是对 HTTP 请求本身。具体来说,Validator 接口没有指定任何采用 HttpServletRequest 对象的方法,这是您需要访问才能获取标头并测试它们的方法。
对于您要解决的任何问题,使用验证框架感觉都是错误的解决方案,尤其是因为很难知道给定表单提交如何有一个唯一的 HTTP 请求标头。您是否正在寻找应该始终存在于您的应用程序请求中的 HTTP 标头?然后您可能需要考虑实现一个HandlerInterceptor,它将拦截并处理对您在任何 HanderMappings 中映射的页面的所有请求。您是否正在寻找应该始终出现在应用的任何页面视图中的 HTTP 标头?然后你想实现一个Filter,它在 Spring MVC 的上下文之外运行。