我发现可以在通用过滤器中以线程安全的方式设置 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
实现也是线程安全的,所以如果上面的代码在过滤器中工作正常,理论上它在拦截器中必须是工作线程安全的。
任何意见 ?!