Проверка заголовков запроса с помощью среды проверки Spring

Можно ли использовать структуру проверки Spring с Spring MVC для проверки наличия и значения заголовка HTTP-запроса?


person Edward Q. Bridges    schedule 19.10.2009    source источник


Ответы (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. Для этого вам нужно

  1. Добавьте @Validated в класс контроллера. Это временное решение необходимо до тех пор, пока не будет реализована эта функция.
  2. Добавьте аннотацию JSR-303 к параметру заголовка запроса, например.

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

Однако обратите внимание, что это приведет к 500 в случае недопустимого значения заголовка. Проверьте этот вопрос, чтобы узнать, как также получить правильный код состояния (например, 400) для этого случая.

person oberlies    schedule 27.02.2019
comment
При пропущенном заголовке сообщение любит Missing request header 'Header-Name' for method parameter of type String, а при нарушении doAction.headerValue: must match "[A-Za-z]*", поэтому пишет имя переменной, а не имя заголовка. Возможно ли показать имя заголовка? - person nikli; 28.10.2020

Я не понимаю, как это возможно, поскольку структура проверки работает только с объектами вашего домена, а не с самим HTTP-запросом. В частности, валидатор interface не указывает какие-либо методы, принимающие объект HttpServletRequest, к которому вам потребуется доступ, чтобы получить заголовки и протестировать их.

Использование структуры проверки кажется неправильным решением любой проблемы, которую вы пытаетесь решить, особенно потому, что трудно понять, как может быть уникальный заголовок HTTP-запроса для данной отправки формы. Вы хотите протестировать HTTP-заголовок, который должен всегда присутствовать в запросах к вашему приложению? Затем вы можете рассмотреть возможность реализации HandlerInterceptor, который будет перехватывать и обрабатывать все запросы к страницам, которые вы сопоставили в любых HanderMappings. Вы хотите протестировать HTTP-заголовок, который должен всегда присутствовать в любом представлении страницы вашего приложения? Затем вам нужно реализовать фильтр, который работает вне контекста Spring MVC.

person delfuego    schedule 19.11.2009
comment
у нас есть собственный http-клиент, который отправляет http-заголовок, чтобы идентифицировать себя. я думаю, что перехватчик обработчика - это путь. Благодарность! - person Edward Q. Bridges; 19.11.2009