2017-08-20 37 views
0

我有一個servlet與SAML和IS WO2服務器正在工作。登錄後,系統從LDAP獲取用戶數據。該庫是使用JSF(Faces Context)爲應用程序創建的。Java與SSO登錄

有一個名爲LoginUtil的類,它通過靜態方法使用戶數據可用,例如:getUserId(),getUserEmail()等...每個方法通過Faces Context獲取HTTP Session來檢索以前保存的用戶數據在登錄時。

現在我們有一些新的應用程序正在使用Spring啓動,因此,LoginUtil類不再工作。

我想建議更改LoginUtil類,以使其可用於任何應用程序。起初我的想法是刪除面上下文並使用純會話對象,但由於該方法是靜態的,我不能在其中使用普通變量。和我不能使用靜態變量,因爲應用程序將部署在羣集服務器。

任何想法?

回答

0

你的第一個想法是不是瘋了,

ContextFaces,用來請求一個ThreadLocal,

,你可以做同樣的事情,做一個ThreadLocal,爲每一個請求,通過使用Servlet過濾器,然後把一個本地登錄用戶,這將在每個應用程序工作

class LoginUtil { 
private static final ThreadLocal<UserInformation> userInfo = new ThreadLocal(); 

void setUserInfo(UserInformation user){ 

userInfo.set(user); 
} 


} 

class UserInformation{ 
HttpSession session; 

UserInformation(HttpSession session){ 
this.session = session; 
} 
} 

@WebFilter() 
class FilterFoo implements Filter{ 

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { 
    try{ 
    LoginUtil.setUserInfo(new UserInformation(request.) 
    chain.doFilter(((HttpServletRequest)request).getSession(),response); 
    }finally{ 
    LoginUtil.setUserInfo(null); 
    } 
}