【问题标题】:Is Spring HandlerInterceptorAdapter postHandle guaranteed?Spring HandlerInterceptorAdapter postHandle 有保证吗?
【发布时间】:2015-03-17 07:25:59
【问题描述】:

我目前有两个处理类似功能的拦截器。我想合并这些。

一个拦截器是一个访问请求记录器,它显示登录用户、会话 ID 和请求的 URL。

另一个拦截器是进程时间记录器。

访问记录器为了记录所有必须记录的内容,在 preHandle 方法中记录请求。这个想法是,无论之后发生什么(即异常),确切的访问请求都会在那里。

但是,由于其性质,进程时间记录器必须登录 postHandle 方法。

为了合并此功能,我必须将所有内容都移到一个 postHandle 方法中。但是,如果某处发生异常,尤其是(尚未)在应用程序代码中正确处理的异常,似乎我可能会丢失一些日志记录。

对这些注意事项有任何保证或说明吗?

【问题讨论】:

    标签: java spring spring-mvc logging


    【解决方案1】:

    您可以考虑合并 afterCompletion 中的逻辑,即使在处理程序方法抛出异常的情况下也会调用该逻辑。好online example

    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));
        }
     }
    

    【讨论】:

      猜你喜欢
      • 2020-10-09
      • 1970-01-01
      • 2012-04-18
      • 2010-10-22
      • 2010-09-19
      • 2017-08-13
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多