Class TransactionContextInterceptor

java.lang.Object
com.easydesk.modules.interceptor.TransactionContextInterceptor
All Implemented Interfaces:
org.springframework.web.servlet.HandlerInterceptor

@Component public class TransactionContextInterceptor extends Object implements org.springframework.web.servlet.HandlerInterceptor
요청 URL 의 path variable / query parameter 에서 현재 Module, ItemType, ActivitySetType, ActivitySet 을 읽어서 TransactionContextHolder, RequestContextHolder 에 반영한다.

역할 분담

  1. WebTransactionContextFilter, WebRequestContextFilter : 세션에 저장된 기본 Context (userId 등) 를 ThreadLocal 에 바인딩하고, finally 에서 clear 한다.
  2. 이 Interceptor : Filter 가 바인딩한 기본 Context 를 base 로, 이번 요청 URL 에 있는 값으로 덮어쓴 새 Context 객체를 ThreadLocal 에 다시 넣는다. (Context 는 immutable)
Filter 시점에는 DispatcherServlet 의 HandlerMapping 이 아직 실행되지 않아 {moduleId} 같은 path variable 을 알 수 없으므로 Interceptor 에서 처리한다. Interceptor 는 Filter chain 안쪽에서 실행되므로 여기서 세팅한 값도 Filter 의 finally 에서 함께 정리된다.

주의

  • 세션은 갱신하지 않는다. 여러 탭에서 서로 다른 Module 을 열어도 섞이지 않도록 URL 을 기준 값으로 삼고, URL 에 값이 없으면 세션(Filter 가 바인딩한) 값을 그대로 사용한다.
  • userId 는 절대 URL 에서 받지 않는다 (예: /admin/modules/{moduleId}/users/{userId}/roles 의 userId 는 관리 대상 사용자이지 actor 가 아니다).
  • path variable 이름은 moduleId, itemTypeId(별칭 typeId), activitySetTypeId, activitySetId 로 통일한다. {id} 처럼 의미가 모호한 이름은 인식하지 않는다.

TransactionContextInterceptor
  • Field Details

    • MODULE_KEYS

      public static final String[] MODULE_KEYS
    • ITEM_TYPE_KEYS

      public static final String[] ITEM_TYPE_KEYS
    • ACTIVITY_SET_TYPE_KEYS

      public static final String[] ACTIVITY_SET_TYPE_KEYS
    • ACTIVITY_SET_KEYS

      public static final String[] ACTIVITY_SET_KEYS
  • Constructor Details

    • TransactionContextInterceptor

      public TransactionContextInterceptor()
  • Method Details

    • preHandle

      public boolean preHandle(@NonNull HttpServletRequest request, @NonNull HttpServletResponse response, @NonNull Object handler)
      Specified by:
      preHandle in interface org.springframework.web.servlet.HandlerInterceptor
    • afterCompletion

      public void afterCompletion(@NonNull HttpServletRequest request, @NonNull HttpServletResponse response, @NonNull Object handler, @Nullable Exception ex)
      Specified by:
      afterCompletion in interface org.springframework.web.servlet.HandlerInterceptor