Intercepting incoming client request using ClientHttpRequestInterceptor with RestController

我是研究僧i 提交于 2020-06-28 06:42:12

问题


I want to append some data to the incoming request. Like random generated token or uuid to the incoming request. And then I want to process it through the controller. I came to know about ClientHttpRequestInterceptor. But looking at this doc, it seems like it only intercept the response, it doesn't intercept the request. Which is what I am not looking. Is there any other way to do this ?

And how can I register this intercept in my RestController ? So that before controller process the request, the request should already has the data.

EDIT: I just found out, I can directly set the data in controller using set method in request body. And this is working. But I am not sure if this is recommended way. Because as far as I know the request has to be modified in dispatcher servlet.

Please advice.


回答1:


You need to add your own OncePerRequestFilter implementation. In the next link you will be able to see an example of that:

Filter example

In this case, it uses TheadContext (MDC) to include the information you want to use in your controller layer (do not include "something similar" to MDC.remove(mdcTokenKey); in your code, you want to keep the information on MDC to access it in your controller).

PD: The internal server of Spring MVC: Tomcat, Jetty, etc reuses the threads so, if you don't want to have some problems it is important you include always a value in your "TheadContext cache". In that way, you will avoid to find "old values", I mean, values included in the current thread but in a "previous Http request".


UPDATE (modify the request body):

Take a look to the following link if you want to modify the request itself:

Modify request content before manage it in controller




回答2:


If you don't want to do it this way (How to modify request body before reaching controller in spring boot), you might do one of the following:

  1. OncePerRequestFilter (as mentioned in the @doctore answer) and add a parameter to the request. This would allow you to add data to the request, but not change anything sent by the client.
  2. Add a method in the controller and call it at the start of processing. I don't like this as much because unlike the filter approach, this requires you to call the method.
  3. [Note: I've never tried this, but it should work] Add a method [somewhere] and use Spring AOP to call it before entering the handler method in the controller. This is fine, but is essentially just you creating your own way of processing a OncePerRequestFilter.

There are surely other ways of doing this with Spring, I just don't know them.



来源:https://stackoverflow.com/questions/62495940/intercepting-incoming-client-request-using-clienthttprequestinterceptor-with-res

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!