복붙노트

[SPRING] Spring HandlerInterceptorAdapter postHandle이 보장됩니까?

SPRING

Spring HandlerInterceptorAdapter postHandle이 보장됩니까?

현재 비슷한 기능을 처리하는 두 개의 인터셉터가 있습니다. 나는 이것을 병합하고 싶다.

하나의 인터셉터는 액세스 요청 로거이며 로그인 한 사용자, 세션 ID 및 요청 된 URL을 표시합니다.

다른 인터셉터는 프로세스 시간 로거입니다.

액세스 로거는 기록되어야하는 모든 것을 기록하기 위해 요청을 preHandle 메소드에 기록합니다. 아이디어는 예외 (예 : 예외) 후에 발생하는 상황에 관계없이 정확한 액세스 요청이 거기에있을 것이라는 것입니다.

그러나 프로세스 시간 로거는 특성상 postHandle 메소드에 로그인해야합니다.

이 기능을 병합하려면 모든 것을 단일 postHandle 메서드로 옮겨야합니다. 그러나 예외가 어딘가에서 발생하면 일부 로깅이 손실 될 수 있습니다. 특히 응용 프로그램 코드에서 제대로 처리되지 않은 경우가 있습니다.

이러한 고려 사항에 대한 보증이나 설명이 있습니까?

해결법

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

    1.핸들러 메소드가 예외를 throw하는 경우에도 호출되는 afterCompletion의 논리를 병합하는 것을 고려할 수 있습니다. 좋은 온라인 예제

    핸들러 메소드가 예외를 throw하는 경우에도 호출되는 afterCompletion의 논리를 병합하는 것을 고려할 수 있습니다. 좋은 온라인 예제

    public class RequestProcessingTimeInterceptor extends HandlerInterceptorAdapter {
    
        private static final Logger logger = LoggerFactory
                .getLogger(RequestProcessingTimeInterceptor.class);
    
        @Override
        public boolean preHandle(HttpServletRequest request,
                HttpServletResponse response, Object handler) throws Exception {
            long startTime = System.currentTimeMillis();
            logger.info("Request URL::" + request.getRequestURL().toString()
                    + ":: Start Time=" + System.currentTimeMillis());
            request.setAttribute("startTime", startTime);
            //if returned false, we need to make sure 'response' is sent
            return true;
        }
    
        @Override
        public void postHandle(HttpServletRequest request,
                HttpServletResponse response, Object handler,
                ModelAndView modelAndView) throws Exception {
            System.out.println("Request URL::" + request.getRequestURL().toString()
                    + " Sent to Handler :: Current Time=" + System.currentTimeMillis());
            //we can add attributes in the modelAndView and use that in the view page
        }
    
        @Override
        public void afterCompletion(HttpServletRequest request,
                HttpServletResponse response, Object handler, Exception ex)
                throws Exception {
            long startTime = (Long) request.getAttribute("startTime");
            logger.info("Request URL::" + request.getRequestURL().toString()
                    + ":: End Time=" + System.currentTimeMillis());
            logger.info("Request URL::" + request.getRequestURL().toString()
                    + ":: Time Taken=" + (System.currentTimeMillis() - startTime));
        }
     }
    
  2. from https://stackoverflow.com/questions/28022108/is-spring-handlerinterceptoradapter-posthandle-guaranteed by cc-by-sa and MIT license