Перехват входящего клиентского запроса с помощью ClientHttpRequestInterceptor с RestController - PullRequest
1 голос
/ 21 июня 2020

Я хочу добавить данные во входящий запрос. Как случайно сгенерированный токен или uuid для входящего запроса. А потом хочу обработать через контроллер. Я узнал о ClientHttpRequestInterceptor. Но, глядя на это do c, кажется, что он только перехватывает ответ, он не перехватывает запрос. Чего я не ищу. Есть ли другой способ сделать это?

И как я могу зарегистрировать этот перехват в моем RestController? Так что до того, как контроллер обработает запрос, запрос уже должен иметь данные.

EDIT: Я только что узнал, я могу напрямую установить данные в контроллере, используя метод set в теле запроса. И это работает. Но я не уверен, рекомендуется ли это. Потому что, насколько я знаю, запрос должен быть изменен в сервлете диспетчера.

Пожалуйста, посоветуйте.

Ответы [ 2 ]

2 голосов
/ 22 июня 2020

Если вы не хотите делать это таким образом ( Как изменить тело запроса до достижения контроллера при загрузке Spring ), вы можете выполнить одно из следующих действий:

  1. OncePerRequestFilter (как указано в ответе @doctore) и добавьте параметр в запрос. Это позволит вам добавлять данные в запрос, но не изменять ничего, отправляемого клиентом.
  2. Добавьте метод в контроллер и вызовите его в начале обработки. Мне это не нравится, потому что, в отличие от подхода с фильтрами, для этого требуется вызвать метод.
  3. [Примечание: я никогда не пробовал это, но он должен работать] Добавьте метод [где-нибудь] и используйте Spring AOP для его вызова перед вводом метода обработчика в контроллере. Это нормально, но, по сути, вы просто создаете свой собственный способ обработки OncePerRequestFilter.

Конечно, есть и другие способы сделать это с помощью Spring, я их просто не знаю.

2 голосов
/ 21 июня 2020

Вам необходимо добавить свою OncePerRequestFilter реализацию. В следующей ссылке вы увидите пример этого:

Пример фильтра

В этом случае он использует TheadContext (MD C ) , чтобы включить информацию, которую вы хотите использовать на уровне вашего контроллера (не включайте в свой код «что-то похожее» на MDC.remove(mdcTokenKey);, вы хотите сохранить информацию на MDC для доступа к ней в вашем контроллере).

PD: Внутренний сервер Spring MVC: Tomcat, Jetty, et c повторно использует потоки, поэтому, если вы не хотите иметь какие-то проблемы, важно, чтобы вы всегда включайте значение в ваш «кеш TheadContext». Таким образом вы избежите нахождения «старых значений», я имею в виду, значений, включенных в текущий поток, но в «предыдущем запросе Http».

ОБНОВЛЕНИЕ (изменение тела запроса):

Взгляните на следующую ссылку, если вы хотите изменить сам запрос:

Изменить запрос содержимое перед управлением им в контроллере

...