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

Reply via email to