2015-01-15 59 views
1

我發現一個可以在一般的過濾器設置的Log4j(SL4J)MDC方面的線程安全的方式(代碼從http://blog.trifork.com/2013/06/06/adding-user-info-to-log-entries-in-a-multi-user-app-using-mapped-diagnostic-context/的Log4j(SLF4J)MDC上下文中的Struts 2攔截

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實現也是線程安全的,所以如果上面的代碼在過濾器中工作正常,理論上它必須在攔截器中工作線程安全。

有什麼意見?

回答

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; 
    } 
}