java - Spring中HTTP请求后是否需要清除MDC

标签 java spring logging log4j logback

根据这个答案thread local variable当我们使用本地线程时,我们应该清除线程​​池环境中的所有变量。

所以基本上我只想确认,当我们使用 MDC(映射诊断上下文)时,我们还应该清除 MDC 以了解内存泄漏,是这样吗?

例如:

@Configuration
public class WebConfig implements WebMvcConfigurer {
    public class HttpInterceptor implements HandlerInterceptor {
        @Override
        public boolean preHandle(final HttpServletRequest request,
                                 final HttpServletResponse response,
                                 final Object handler) {
            MDC.put(SESSION_ID, session_id);
        {

        @Override
        public void postHandle(final HttpServletRequest request,
                               final HttpServletResponse response,
                               final Object handler,
                               final ModelAndView modelAndView) {
           MDC.clear(); //WE SHOULD CLEAR MDC.... if not memory leaks ?
        }
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MdcHandlerInterceptor());
    }
}

最佳答案

不是为了内存泄漏,而是为了防止在请求之间保留信息。您不希望您的第一个请求放置 foo 并且您的第二个请求放置 bar,以 foo bar 结尾而不仅仅是 bar

当然,如果您总是只填写完全相同的值(如远程 IP 等),则不会发生这种情况,但安全总比后悔好。您不想记录不良信息。

注意:您放入一个请求中的信息并不总是传播到下一个请求,因为它们可以在其他线程上执行,即使对于同一端点也是如此。这就是为什么这个问题可能会被忽略的原因,因为它不能可靠地重现,尤其是在您覆盖大部分值的情况下。

关于java - Spring中HTTP请求后是否需要清除MDC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42414643/

相关文章:

java - 它叫什么以及何时在java中使用它作为接口(interface)

logging - GM_log 和其他 GM 函数在 Greasemonkey 脚本中不起作用

Node.js readStream 用于大文件末尾

java - 交换单个字母单词的大小写

java - Map<Long, Entity>,如何让map key引用一个Entity Id?

java - 如何使用 Wordpress 在 spring web 应用程序中对用户进行身份验证?

email - Logback SMTPAppender 不适用于 gmail 配置

java - 如何在 EL 中比较字符串变量?

Java System.out.println 将计算向上舍入

java - 在 Jenkins 中运行 Windows Batch Commando 时出错,但在 CMD 中运行正常