On Fri, 2005-04-22 at 17:58 -0400, Patrick B Haggood wrote:
> (description of shared session/multi-user problem deleted)
Figure it out, in case anyone else has this problem. I was using
getSession(true/false) incorrectly. Now my backing beans (i.e.
UserController for all userpages), when they request a pointer to the
Service layer, get one that's already initalized from the session with
the current user (and connection info to boot).
Here's the corrected login and other dependent functions:
========================
public String userLogin(){
String nextPage = null;
// loginbean contains username, id, etc used to authenticate from db
LoginBean lb = new LoginBean();
// defaultcontroller is backing bean controlling login
lb.setCurrentUser(defaultController.getAppService().login(loginname,loginpass));
if (lb.isUserLoginStatus()){
if (lb.isAdminLoginStatus()){
activeController = new AdminController();
nextPage = "adminmanager";
}
else{
activeController = new UserController();
nextPage = "usermanager";
}
// save user in session
setUserSession(lb); <<-------magic happens here
}
return nextPage;
}
private void setUserSession(LoginBean lb){
// create new session
session = (HttpSession)
FacesContext.getCurrentInstance().getExternalContext().getSession(true);
// create a new loginbean
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("loginbean",lb);
}
================
UserController.java extends AppController
// get list of groups to which currently logged in user is a member
public List getSelectUserGroupList() {
int currentUser =
getActiveLogin().getCurrentUser().getUserpk().intValue();
// grab a service pointer to execute this request
this.selectUserGroupList =
ListItemArrayListToSelectItem(getAppService().getUserMemberList(currentUser));
return selectUserGroupList;
}
==================
AppController.java
// do we have a service pointer? if not, init one.
public MateoConsultingService getAppService() {
if (appService ==null){
appService = new MateoConsultingService();
}
// get loginbean from session via facescontext
appService.setActiveUser(getActiveLogin().getCurrentUser());
// also get application-scoped connection pool pointer
appService.setMyConn(getActiveConnection());
// be vocal about it
System.out.println("Activity for user " +
getActiveLogin().getCurrentUser().getUserfullname());
return appService;
}
public LoginBean getActiveLogin() {
if (activeLogin == null){
activeLogin = (LoginBean)
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("loginbean");
}
return activeLogin;
}