I have worked with JERSEY framework , it provides feature to implement a filter so that all the responses will go through it.
I am new to Spring / Spring boot. I am not understanding how to achieve the above functionality which I mentioned.
Basically I want my each Response should pass through my filter.
How to do this ?
A sample example will be helpful.
If I implemented as follows as @Errabi Ayoub suggested:
@Component
public class MyClassFilter implements Filter {
@Override
public void doFilter( HttpServletRequest req, HttpServletResponse res,
FilterChain chain) throws IOException, ServletException {
// you can modify your response here before the call of chain method
//example
apiLogger.logResponse();
res.setHeader("key", "value");
chain.doFilter(req, res);
}
@Override
public void destroy() {}
@Override
public void init(FilterConfig arg0) throws ServletException {}
}
and I have a method apiLogger.logResponse();
then my method will be called twice, according to my logic, first it will be called at request and then again on response. I don't want that. I want to log only when it is Response.
Thanks.
In Spring boot, we have filters to filter the HTTP request; filter, in general, is used to intercept the request, i.e. HTTP request and the response from the client-side. By the use of a filter, we can perform two operations which can be done on response and request.
Filters can modify inbound and outbound requests and responses including modification of headers, entity and other request/response parameters. Interceptors are used primarily for modification of entity input and output streams. You can use interceptors for example to zip and unzip output and input entity streams.
To work with interceptor, you need to create @Component class that supports it and it should implement the HandlerInterceptor interface. preHandle() method − This is used to perform operations before sending the request to the controller. This method should return true to return the response to the client.
Short Answer is to filter response after the doFilter method.
@Bean
public Filter myCustomFilter() {
return (request, response, chain) -> {
logger.info("do Request Filtering ... ");
chain.doFilter(request, response); // Do Response Filter after this
logger.info("do Response Filtering ... ");
};
}
Explanation
The Servlet Filters in Servlet Container are invoked in a chain with each Filter invoking the next Filter in the chain through the FilterChain doFilter method. The last filter in the filter chain delegates the request to the actual Servlet which then processes the request and generates the Response. The response then passes through each of those filters in the Filter Chain but with the opposite ordering. So, the last filter becomes the first filter while processing the response and it goes through all the filters back to the Client.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With