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

Filter Struts 2拦截器中的Log4j(SLF4J)MDC上下文,filter,struts2,slf4j,log4j2,struts2-interceptors,Filter,Struts2,Slf4j,Log4j2,Struts2 Interceptors,我发现可以在通用过滤器(代码来自)中以线程安全的方式设置Log4j(SL4J)MDC上下文 我可以在Struts 2拦截器中使用相同的方法吗?!我想知道的是线程安全问题 Struts 2拦截器和servlet过滤器并非都是线程安全的,MDC实现是线程安全的,因此,如果上述代码在过滤器中运行良好,理论上它在拦截器中必须是线程安全的 有什么评论吗 拦截器不是线程安全的,这意味着您必须以线程安全的方式编写拦截器。例如,下面的拦截器是线程安全的 公共类LoggerInterceptor扩展了Abstra

我发现可以在通用过滤器(代码来自)中以线程安全的方式设置Log4j(SL4J)MDC上下文

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

Struts 2拦截器和servlet过滤器并非都是线程安全的,
MDC
实现是线程安全的,因此,如果上述代码在过滤器中运行良好,理论上它在拦截器中必须是线程安全的


有什么评论吗

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

公共类LoggerInterceptor扩展了AbstractInterceptor{
@凌驾
公共字符串截获(ActionInvocation调用)引发异常{
HttpSession session=ServletActionContext.getRequest().getSession();
User=(User)session.getAttribute(“USerSession”);
put(“userName”,user.getUserName());
字符串结果;
试一试{
结果=invocation.invoke();
}最后{
删除(“用户名”);
}
返回结果;
}
}
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");
    }
  }
 
}