I have implemented the following interceptor to test setting a header on my request and then my response.
@RestController
public class SpringController {
@PostMapping(value="/test")
public String test(){
return "test";
}
}
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@Component
public class ControllerInterceptor implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("Pre-handle");
System.out.println(request.getHeader("RequestId"));
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
response.setHeader("ResponseId", "2");
System.out.println("Post-handle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
response.addHeader("ResponseId", "2");
System.out.println(response.getHeader("ResponseId"));
System.out.println("After completion");
}
}
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class ControllerInterceptorAppConfig implements WebMvcConfigurer{
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new ControllerInterceptor());
}
}
When i insert a RequestId header in Postman, i can see it's value in the terminal as shown below:
Pre-handle
1
Post-handle
null
After completion
But the ResponseId header value is null on the terminal and does not even appear in Postman reponse. How should i set the ResponseId header?
You add the response header too late, in the postHandle()
and afterCompletion()
methods the response could already be sent.
Add the headers in the preHandle()
method instead.
Someone else had a similar problem here: Add response header in HandlerInterceptorAdapter