Можно ли использовать структуру проверки Spring с Spring MVC для проверки наличия и значения заголовка HTTP-запроса?
Проверка заголовков запроса с помощью среды проверки Spring
Ответы (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) для этого случая.
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.