代码之家  ›  专栏  ›  技术社区  ›  Edward Q. Bridges

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

  •  3
  • Edward Q. Bridges  · 技术社区  · 15 年前

    是否可以使用Spring验证框架和SpringMVC来验证HTTP请求头的存在和值?

    2 回复  |  直到 5 年前
        1
  •  1
  •   oberlies Jochen Ehret    5 年前

    检查 存在 对于请求头,您不需要验证框架。默认情况下,请求头参数是强制的,如果请求中缺少强制头,SpringMVC会自动响应400个错误的请求。

    所以下面的代码会自动检查头“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)。

        2
  •  4
  •   delfuego    15 年前

    我不明白这是如何实现的,因为验证框架只在您的域对象上运行,而不是在HTTP请求本身上运行。明确地, the Validator interface 不指定采用httpservletrequest对象的任何方法,这是为了获取头并测试它们而需要访问的方法。

    使用验证框架对于您试图解决的任何问题都是错误的解决方案,特别是因为很难知道给定表单提交的HTTP请求头是如何唯一的。是否要测试应该 总是 在应用程序请求中出现?那么您可能需要考虑实现 HandlerInterceptor ,它将截获并处理所有对您在任何handermapping中映射的页面的请求。是否要测试应该 总是 出席 任何 应用程序的页面视图?那么你就要实现一个 Filter 它在SpringMVC环境之外运行。