0

I want to set the header of HttpServletResponse in filter or something similar after the Response is generated in my spring boot project. In filter, I can do something similar:

 ((HttpServletResponse)servletResponse).addHeader("test","value");
  fc.doFilter(request, servletResponse);

But the problem is that my header value is generated from the response body(payload) itself, so I have to use the content of ServletResponse payload to add it to the header. How can I do it?

I could do it on controller level but I don't want to do it manually for all the responses.

Yashasvi Raj Pant
  • 1,274
  • 4
  • 13
  • 33
  • 1
    This should answer your question:[https://stackoverflow.com/a/8972088/7994967](https://stackoverflow.com/a/8972088/7994967) – Qiu Zhou Sep 18 '20 at 02:50

2 Answers2

1

I implemented the ContentCachingResponseWrapper in the Filter to get the response body and to add the header from ServletResponse as follow:

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

        ContentCachingResponseWrapper responseCacheWrapperObject = new ContentCachingResponseWrapper((HttpServletResponse) servletResponse);
        filterChain.doFilter(servletRequest, responseCacheWrapperObject);

        byte[] responseArray = responseCacheWrapperObject.getContentAsByteArray();
        String responseStr = new String(responseArray, responseCacheWrapperObject.getCharacterEncoding());
        
       //This is my own logic function to generate header value from responseStr
       String headerValue = getHeaderValueFromResponseString(responseStr);
          
       responseCacheWrapperObject.addHeader("headerKey", headerValue)

        responseCacheWrapperObject.copyBodyToResponse();
    }
Yashasvi Raj Pant
  • 1,274
  • 4
  • 13
  • 33
0

You can make use of this code

 String authorizationHeader = request.getHeader("Authorization");
        if (authorizationHeader != null && authorizationHeader.startsWith("Bearer ")) {
            token = authorizationHeader.substring(7);
            userName = jwtUtil.extractUsername(token);
            request.setAttribute("userid",userName);
        }

so now this code generates a token where you have userid that gives userName along with the token