복붙노트

[SPRING] RequestContextHolder와 같은 Response의 홀더 클래스가없는 이유는 무엇입니까?

SPRING

RequestContextHolder와 같은 Response의 홀더 클래스가없는 이유는 무엇입니까?

Spring이 HttpServletResponse를위한 RequestContextHolder와 같은 클래스를 가지지 않는 이유는 무엇인가? 응답 개체에 액세스해야하는 경우가 있습니다. 예를 들어 스프링 보안은 성공적인 로그인을 위해 InteractiveSuccessEvent를 생성합니다. 내 이벤트 핸들러는 쿠키에 대한 일부 값을 올바르게 설정해야하며 HttpServletResponse 객체를 수정하는 명시적인 방법을 알지 못합니다.

편집 : 핸들러의 예

@Component
public class ActivityLoginSuccessEventHandler implements ApplicationListener<InteractiveAuthenticationSuccessEvent> {

   @Override
   public void onApplicationEvent(InteractiveAuthenticationSuccessEvent event) {
      //todo cookie
   }
}

해결법

  1. ==============================

    1.나는 간단한 필터로 끝났다.

    나는 간단한 필터로 끝났다.

    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);
          }
       }
    }
    
  2. ==============================

    2.더 나은 솔루션을 찾지 못하면 UsernameAndPasswordAuthenticationFiter를 확장 할 수 있습니다. http://docs.spring.io/autorepo/docs/spring-security/3.0.x/apidocs/org/springframework/security/web/authentication/UsernamePasswordAuthenticationFilter .html (또는 대신 사용하는 AuthenticationFilter)를 사용하면 요청 및 응답에 대한 액세스 권한이 있습니다.

    더 나은 솔루션을 찾지 못하면 UsernameAndPasswordAuthenticationFiter를 확장 할 수 있습니다. http://docs.spring.io/autorepo/docs/spring-security/3.0.x/apidocs/org/springframework/security/web/authentication/UsernamePasswordAuthenticationFilter .html (또는 대신 사용하는 AuthenticationFilter)를 사용하면 요청 및 응답에 대한 액세스 권한이 있습니다.

  3. from https://stackoverflow.com/questions/20531204/why-there-is-not-a-holder-class-for-response-like-requestcontextholder by cc-by-sa and MIT license