当前位置: 首页 > 面试题库 >

Spring HandlerInterceptorAdapter postHandle是否得到保证?

白宏义
2023-03-14
问题内容

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

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

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

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

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

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

关于这些考虑因素,是否有任何保证或说明?


问题答案:

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


 类似资料:
  • 问题内容: 假设我在bash中有一个for循环,如下所示: 是否保证了迭代的顺序,即循环将始终以相同的顺序处理文件吗?如果可以保证,顺序是否按字母顺序? 问题答案: 根据bash手册页: 路径名扩展 拆分单词后,除非已设置-f选项,否则bash会在每个单词中扫描字符* 、?和[。如果出现这些字符之一,则将该单词视为一个模式,并替换为与该模式匹配的文件名按字母顺序排列的列表(请参见下面的“模式匹配”

  • 问题内容: 我特别想知道PostgreSQL。给出以下人为的示例: 从外部查询返回的名称是否保证与内部查询的顺序相同? 问题答案: 不,在外部查询中按以下顺序排序: 内部(子)查询返回结果集。如果按此顺序进行排序,则保证从内部(子)查询传递到外部查询的中间结果集将按照您指定的方式进行排序,但是在外部查询中不对结果进行排序通过处理内部查询结果集生成的结果集,不能保证以任何方式进行排序。

  • 问题内容: 考虑以下代码: 当第一个URL够用时会被要求输入第二个URL吗? 我尝试了一个较小的示例,它看起来像预期的那样工作。即一个一个地处理数据,但是可以依靠这种行为吗?如果没有,在帮助之前打电话吗? 输出: 更新 :如果对实施很重要,请使用官方Oracle JDK8 答案 :根据下面的评论和答案,flatmap部分是惰性的。即完全读取第一个流,并且仅在需要时才读取下一个。渴望读取一个流,但是

  • 问题内容: 我真的是在这里指身份平等。 例如,以下内容将始终打印 true 吗? 问题答案: 是的,类令牌是唯一的(对于任何给定的类加载器而言)。 即,您将始终 在相同的类加载器领域中 获得对相同物理对象的引用。但是,不同的类加载器将加载不同的类令牌,同时,当两个不同的类加载器加载相同的类定义时,会将相同的类定义视为不同。

  • 问题内容: 众所周知,JavaScript在所有现代浏览器实现中都是单线程的,但是它是在任何标准中指定的,还是仅根据传统?假设JavaScript始终是单线程的,是否完全安全? 问题答案: 这是个好问题。我很想说“是”。我不能 通常认为JavaScript具有脚本(*)可见的单个执行线程,因此,当您输入内联脚本,事件侦听器或超时时,您将完全处于控制状态,直到从块或函数的结尾返回为止。 (*:忽略浏

  • 我想做的是将一个 64 位无符号整数存储为 类型,保留其间隔二进制表示形式。 例如,我想保存 2^63-1=9223372036854775807(9223372036854775807)(2^63-1 和 2^63 = 9223372036854775808 = 10000000 000000000000000000000000000000000 000000000000(2) as-92233

  • 我正在搜索动觉数据流的文档,但我找不到像 动情保证至少一次交付 从生产者方面,我预计发送的消息会传播到多个节点(类似于Kafka的ack=all)从消费者方面,我预计在消费者成功处理时会有相当于Kafka提交偏移量的东西,或者类似于Google Cloud的Pub/Sub消息确认。 是否有动觉提交信息保证?是否有动觉处理保证(如果已处理并确认已处理,则将消息标记为只读)

  • 问题内容: 在下面的程序中,如果执行了此程序(例如,通过命令行),则是否可以单独确保args JVM不为null? 问题答案: 简短的回答:是的,它的长度可能为0,但不会为null。