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 インターセプターとサーブレット フィルターは両方ともスレッド セーフではなく、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 に答える