1

我发现可以在通用过滤器中以线程安全的方式设置 Log4j (SL4J) MDC 上下文(代码来自使用 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实现也是线程安全的,所以如果上面的代码在过滤器中工作正常,理论上它在拦截器中必须是工作线程安全的。

任何意见 ?!

4

1 回答 1

1

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

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;
  }
}
于 2015-01-15T21:38:34.117 回答