java - Spring HandlerInterceptorAdapter postHandle 有保证吗?

标签 java spring spring-mvc logging

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

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

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

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

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

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

是否有关于这些注意事项的任何保证或描述?

最佳答案

您可以考虑合并 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));
    }
 }

关于java - Spring HandlerInterceptorAdapter postHandle 有保证吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28022108/

相关文章:

Java Jpanel,无法设置背景颜色

java - 从外部 bean 注入(inject) bean 属性

java - 如何在beans.xml中使用@JsonPropertyOrder注释

java - Spring : Request method 'POST' not supported

java - Spring MVC : large files for download, OutOfMemoryException

java - Java 中的 ASCII 到 UTF-8 的转换

java - 如何在投票方法的 AccessDecisionVoter 实现中获取要获取的 url?

java.sql.SQLException : Duplicate entry 'sd' for key 'PRIMARY' 异常

javascript - Spring Rest 服务中的 Angular File Saver

java - Spring Boot 国际化(messages.properties)