你可以,但我會用一個簡單的POJO來保持事情乾淨地分開。請記住,存儲在單例中的值只能由處理servlet請求的同一個線程訪問,所以如果您正在做任何異步操作,則需要對此進行說明。這裏有一個超級基本IMPL:
public class OrgId {
public static ThreadLocal<Integer> orgId = new ThreadLocal<Integer>();
}
由於機構ID是居住在會話中,你可以設置的ThreadLocal的價值在這樣(沒有太多錯誤檢查)早期的Servlet過濾器:
public class OrgIdFilter implements Filter {
public void doFilter(ServletRequest servletrequest, ServletResponse servletresponse, FilterChain filterchain) throws java.io.IOException, javax.servlet.ServletException {
int orgId = 0;
HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpSession session = req.getSession();
orgId = Integer.parseInt(session.getAttribute("OrganizationalIdAttr"));
try {
OrgId.orgId.set(orgId);
filterChain.doFilter(servletRequest, servletresponse);
} finally {
OrgId.orgId.set(null); // Important to clear after request !!
}
}
}
這假定ORGID是當過濾器被稱爲會話,但如果沒有,你的想法....
然後在您攔截器(或幾乎任何地方),你可以得到線程的當前ORGID與:
OrgId.orgId.get(); // Might be null.....
這裏的一個潛在問題是,所有這些組件(過濾器,OrgId和攔截器)都需要由相同的類加載器加載,以確保OrgId類實際上是單例,否則,具有多個ThreadLocal實例掛在它周圍不會一直工作,或根本不工作。不用說,所有這些都需要在同一個虛擬機中進行。
我不確定這是否是最簡潔的方法來解決這個問題,但它確實讓您的組織在您需要它的地方。
你的意思是說,我可以在我的Servlet有一個ThreadLocal變量/控制器,並獲得它在Hibernate攔截器? 我如何訪問ThreadLocal變量。它應該在Servlet中是公共靜態的嗎? – Sathish 2009-01-08 20:47:19