4

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

4

2 回答 2

8

要检查请求标头的存在,您不需要验证框架。请求头参数默认是强制的,如果请求中缺少强制头,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到控制器类。这是实现此功能之前需要的解决方法。
  2. 在请求头参数中添加 JSR-303 注解,例如

    @RequestHeader("Header-Name") @Pattern(regexp = "[A-Za-z]*") String headerValue
    

但是请注意,如果标头值无效,这将导致 500。检查此问题以了解如何获得这种情况下的正确状态代码(即 400)。

于 2019-02-27T09:31:32.117 回答
3

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

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

于 2009-11-19T18:11:41.787 回答