why there is not a holder class for Response like RequestContextHolder

spring

Solution

I ended up with a simple filter.

public class ResponseContextHolderFilter extends OncePerRequestFilter {

   @Override
   protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
      try {
         RequestAndResponseContextHolder.response(response);
      } finally {
         filterChain.doFilter(request, response);
      }
   }
}


public class RequestAndResponseContextHolder {

   public static final String RESPONSE_NAME_AT_ATTRIBUTES =
      ServletRequestAttributes.class.getName() + ".ATTRIBUTE_NAME";


   public static HttpServletResponse response() {
      RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
      HttpServletResponse response = null;
      if(requestAttributes != null) {
         ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) requestAttributes;
         response = (HttpServletResponse) servletRequestAttributes.getAttribute(RESPONSE_NAME_AT_ATTRIBUTES, RequestAttributes.SCOPE_REQUEST);
      }
      return response;
   }

   public static HttpServletRequest request() {
      RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
      HttpServletRequest request = null;
      if(requestAttributes != null) {
         ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) requestAttributes;
         request = servletRequestAttributes.getRequest();
      }
      return request;
   }

   public static void response(HttpServletResponse response) {
      RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();

      if(requestAttributes != null) {
         ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) requestAttributes;
         servletRequestAttributes.setAttribute(RESPONSE_NAME_AT_ATTRIBUTES, response, RequestAttributes.SCOPE_REQUEST);
      }
   }
}

Problem

Why Spring does not have a class like RequestContextHolder for `HttpServletResponse`? There are some cases I need to access response object. For example spring security is creating an InteractiveSuccessEvent for successful logins. My event handler needs properly set some values to cookie and I do not know an explicit way to modify `HttpServletResponse` object. Edit: Example of handler ``` @Component public class ActivityLoginSuccessEventHandler implements ApplicationListener<InteractiveAuthenticationSuccessEvent> { @Override public void onApplicationEvent(InteractiveAuthenticationSuccessEvent event) { //todo cookie } } ```

Original source