[SPRING] RequestContextHolder와 같은 Response의 홀더 클래스가없는 이유는 무엇입니까?
SPRINGRequestContextHolder와 같은 Response의 홀더 클래스가없는 이유는 무엇입니까?
Spring이 HttpServletResponse를위한 RequestContextHolder와 같은 클래스를 가지지 않는 이유는 무엇인가? 응답 개체에 액세스해야하는 경우가 있습니다. 예를 들어 스프링 보안은 성공적인 로그인을 위해 InteractiveSuccessEvent를 생성합니다. 내 이벤트 핸들러는 쿠키에 대한 일부 값을 올바르게 설정해야하며 HttpServletResponse 객체를 수정하는 명시적인 방법을 알지 못합니다.
편집 : 핸들러의 예
@Component
public class ActivityLoginSuccessEventHandler implements ApplicationListener<InteractiveAuthenticationSuccessEvent> {
@Override
public void onApplicationEvent(InteractiveAuthenticationSuccessEvent event) {
//todo cookie
}
}
해결법
-
==============================
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.더 나은 솔루션을 찾지 못하면 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)를 사용하면 요청 및 응답에 대한 액세스 권한이 있습니다.
from https://stackoverflow.com/questions/20531204/why-there-is-not-a-holder-class-for-response-like-requestcontextholder by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Classpath를 가진 Spring Boot 실행 가능한 Jar (0) | 2019.05.11 |
---|---|
[SPRING] 봄 / JTA / JPA DAO 통합 테스트가 롤백되지 않습니까? (0) | 2019.05.11 |
[SPRING] Spring 클라우드 스트림 - 애플리케이션 초기화 후 메시지 보내기 (0) | 2019.05.11 |
[SPRING] 스프링 보안 : @PreAuthorize에서 Hibernate 엔티티 매개 변수에 액세스 할 수없는 이유는 무엇입니까? (0) | 2019.05.11 |
[SPRING] 스프링 컨트롤러 메소드에서 @ Valid / @ Validated 주석 이전에 내 Spring 요소를 실행하려면 어떻게해야합니까? (0) | 2019.05.11 |