Struts 2 拦截器中的 Log4j (SLF4J) MDC 上下文

Log4j (SLF4J) MDC Context in Struts 2 Interceptor

我发现可以在通用过滤器中以线程安全方式设置 Log4j (SL4J) MDC 上下文(代码来自 Adding user info to log entries in a multi-user app using Mapped Diagnostic Context

import org.slf4j.MDC;
import javax.servlet.*;
import java.io.IOException;
 
public class MDCFilter implements Filter {
 
  @Override
  public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
          throws IOException, ServletException {
      User user= (User) session.getAttribute("USerSession");
      MDC.put("userName", user.getUserName() );
    try {
      chain.doFilter(req, resp);
    } finally {
        MDC.remove("userName");
    }
  }
 
}

我可以在 Struts 2 拦截器中使用相同的方法吗?!我想知道的是线程安全问题。

Struts 2 拦截器和 servlet 过滤器不是线程安全的,MDC 实现是线程安全的,所以如果上面的代码在过滤器中工作正常,理论上它必须是工作线程安全的拦截器。

有意见吗?!

拦截器不是线程安全的意味着你必须以线程安全的方式编写它们。例如下面的拦截器是线程安全的。

public class LoggerInterceptor extends AbstractInterceptor {
  @Override
  public String intercept(ActionInvocation invocation) throws Exception {
    HttpSession session = ServletActionContext.getRequest().getSession();
    User user= (User) session.getAttribute("USerSession");
    MDC.put("userName", user.getUserName() );
    String result;
    try {
      result = invocation.invoke();
    } finally {
      MDC.remove("userName");
    }
    return result;
  }
}