根据这个答案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/