Piyush Chaudhari
Piyush Chaudhari

Reputation: 1012

Spring Rest API interceptor add response header on each/every request

I am working with Spring 4 REST API annotation based configuration application. I want to add response header on each/every request once user is authenticate by JWT. I have created interceptor for that which looks as below:

public class AuthenticateInterceptor implements HandlerInterceptor {

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object object, Exception arg3)
        throws Exception {
    response.addHeader("afterCompletion", "afterCompletion header");
    response.setHeader("afterCompletion", "afterCompletion header");
    System.out.println("************** afterCompletion **************");
}

@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object object,
        ModelAndView modelAndView) throws Exception {
    response.addHeader("postHandle", "postHandle header");

    System.out.println("************** postHandle **************");
}

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object object) throws Exception {
    System.out.println("************** preHandle **************");

    return true;
  }
}

My interceptor configuration is as below:

@Configuration
public class AdapterConfig extends WebMvcConfigurerAdapter {

@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new AuthenticateInterceptor());
  }

}

When I get JSON response I am not able the see the added header value which are added from interceptor. Any one help me what is the issue and how can I add header from interceptor for each/every request.

Upvotes: 3

Views: 5373

Answers (3)

Dindar
Dindar

Reputation: 3235

I didn't succeed in interceptors, Instead using Filters or WebFilter perfectly works:

@Component
public class ResponseHeaderWebFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain) throws IOException, ServletException {
        HttpServletResponse httpServletResponse = (HttpServletResponse) response;
        httpServletResponse.setHeader("CustomHeaderName", "SomeValue");
        chain.doFilter(request, response);
    }
}

In case you are using webflux reactive component, then :

@Component
public class ResponseHeaderWebFilter implements WebFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
        exchange.getResponse()
          .getHeaders()
          .add("CustomHeaderName", "SomeValue");
        return chain.filter(exchange);
    }
}

Upvotes: 2

Santosh Ganacharya
Santosh Ganacharya

Reputation: 386

You are almost doing same but would like to give you consitant way of achieving same. Please do following changes.

1) Add @Component annotation on AuthenticateInterceptor class. And you package containing this class should be in packages scanned list.

@Component
public class AuthenticateInterceptor implements HandlerInterceptor {
 ...
}

2) Autowire and inject instance of AuthenticateInterceptor like below.

@Configuration
public class AdapterConfig extends WebMvcConfigurerAdapter {

@Autowired
private AuthenticateInterceptor authenticateInterceptor;

@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(authenticateInterceptor);
  }

}

Upvotes: 0

Giampiero Poggi
Giampiero Poggi

Reputation: 419

If it can help you, I've managed it like this: https://stackoverflow.com/a/49431665/4939245
Look at second point

You can put the response header for each call in the application (this is for Spring annotation-based):

@Component
public class Filter extends OncePerRequestFilter {
....
 @Override
 protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
        throws ServletException, IOException {
    //response.addHeader("Access-Control-Allow-Origin", "*");
    //response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
    response.setHeader("Cache-Control", "no-store"); // HTTP 1.1.
    response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
    response.setHeader("Expires", "0"); // Proxies.
    filterChain.doFilter(request, response);
 }
}

I hope I was helpful!

Upvotes: 0

Related Questions