JSF 2托管bean正在不同窗口中登录的多个用户之间共享

时间:2014-11-11 07:19:51

标签: spring jsf javabeans mybatis managed

我正在使用JSF2,Spring 3和Mybatis。在用户登录时,我正在从ConfigAutomationLoginBean.java进行身份验证,其中有其他bean作为其托管属性。问题是我的bean在不同浏览器窗口中的多个用户之间共享。我的所有豆子都是SessionScoped,如果我不这样做,登录后我可能无法获得导航画面。我猜JSF默认使用SessionScoped属性创建所有托管bean。如果我创建初始bean身份验证bean,那会是一个好的想法吗?使用Spring 3将ConfigAutomationLoginBean和其他bean自动连接到它并删除用于初始bean加载的JSF?以下是我的登录代码:

import java.io.Serializable;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;

import com.telus.routerconfigurationtool.dto.UserProfileDTO;
import com.telus.routerconfigurationtool.service.UserManagementService;
import com.telus.routerconfigurationtool.util.CommonUtil;

@Component
@ManagedBean(name = "configAutomationLoginBean")
@SessionScoped
public class ConfigAutomationLoginBean implements Serializable {

  private static final long serialVersionUID = 1L;

  private static final Logger LOGGER = Logger.getLogger(ConfigAutomationLoginBean.class);

  private String id;

  private String password;

  private String role;

  @ManagedProperty(value = "#{userManagementService}")
  private UserManagementService userManagementService;

  @ManagedProperty(value = "#{treeNavigationBean}")
  private TreeNavigationBean treeNavigationBean;

  @ManagedProperty(value = "#{breadCrumbBean}")
  private BreadCrumbBean breadCrumbBean;

  public String authenticateUser() {
    /** Reset and Update BreadCrumb - Add Nodes for Create User **/
    breadCrumbBean.resetBreadCrumbModel(); 
    Boolean authenticUser = false;
    //TODO logic to authenticate user. authenticUser set true if authentication
    //TODO Temporary setting to true
    authenticUser = true;
    if (authenticUser) {
      return authorizeUser();
    } else {
      CommonUtil.displayFacesMessage(this.getClass(), FacesContext.getCurrentInstance(),
          FacesMessage.SEVERITY_ERROR, "ERR1", id);
      return "index";
    }

  }

  private String authorizeUser() {

    UserProfileDTO userProfileDTO = new UserProfileDTO();
    CommonUtil.copyProperties(userProfileDTO, this);

    Boolean authorizedUser = false;
    // logic to authorize user. authorizedUser set true if authorization is
    // successful
    authorizedUser = userManagementService.authorizeUser(userProfileDTO);

    if (authorizedUser) {
      // Set User Role fetched from Database
      this.role = userProfileDTO.getRole();
      treeNavigationBean.setLoggedInUserId(id);
      treeNavigationBean.setLoggedInUserRole(role);
      treeNavigationBean.createTreeByUserRole();
      treeNavigationBean.setViewCenterContent(null);
      return "treeNavigation";
    } else {
      // Display Error Message that user is not authorized.
      CommonUtil.displayFacesMessage(this.getClass(), FacesContext.getCurrentInstance(),
          FacesMessage.SEVERITY_ERROR, "ERR2", id);
      return "index";
    }
  }

  /**
   * @return the id
   */
  public String getId() {
    return id;
  }

  /**
   * @param id the id to set
   */
  public void setId(String id) {
    if (StringUtils.isBlank(id)) {
      this.id = id;
    } else {
      this.id = id.toUpperCase();
    }
  }

  /**
   * @return the password
   */
  public String getPassword() {
    return password;
  }

  /**
   * @param password the password to set
   */
  public void setPassword(String password) {
    this.password = password;
  }

  /**
   * @return the role
   */
  public String getRole() {
    return role;
  }

  /**
   * @param role the role to set
   */
  public void setRole(String role) {
    this.role = role;
  }

  /**
   * @return the userManagementService
   */
  public UserManagementService getUserManagementService() {
    return userManagementService;
  }

  /**
   * @param userManagementService the userManagementService to set
   */
  public void setUserManagementService(UserManagementService userManagementService) {
    this.userManagementService = userManagementService;
  }

  /**
   * @return the treeNavigationBean
   */
  public TreeNavigationBean getTreeNavigationBean() {
    return treeNavigationBean;
  }

  /**
   * @param treeNavigationBean the treeNavigationBean to set
   */
  public void setTreeNavigationBean(TreeNavigationBean treeNavigationBean) {
    this.treeNavigationBean = treeNavigationBean;
  }

  /**
   * @return the breadCrumbBean
   */
  public BreadCrumbBean getBreadCrumbBean() {
    return breadCrumbBean;
  }

  /**
   * @param breadCrumbBean the breadCrumbBean to set
   */
  public void setBreadCrumbBean(BreadCrumbBean breadCrumbBean) {
    this.breadCrumbBean = breadCrumbBean;
  }

}

注意:由于TreeNavigation bean是sessioncoped并且单个实例是共享的,因此每次登录不同用户时都会更改loggedInUserName。如果user1和user 2登录,则首先登录的user1将看到user2的屏幕。

@ManagedBean(name = "treeNavigationBean")
@SessionScoped
public class TreeNavigationBean implements Serializable {
  private static final long serialVersionUID = 1892577430001834938L;

  private static final Logger LOGGER = Logger.getLogger(TreeNavigationBean.class);
  private TreeNode root;

  private TreeNode selectedNode;

  private String loggedInUserId;

  private String loggedInUserRole;

  private String loggedInUserName;

  private String viewCenterContent;

  private String userAction;

  @ManagedProperty(value = "#{userProfileBean}")
  private UserProfileBean userProfileBean;

  @ManagedProperty(value = "#{createConfigurationBean}")
  private CreateConfigurationBean createConfigurationBean;

  @ManagedProperty(value = "#{placeholderBean}")
  private CreateConfigPlaceholderBean placeholderBean;

  @ManagedProperty(value = "#{ncParamMappingBean}")
  private NCParamMappingBean ncParamMappingBean;

  @ManagedProperty(value = "#{breadCrumbBean}")
  private BreadCrumbBean breadCrumbBean;

  @ManagedProperty(value = "#{createTemplateBean}")
  private CreateTemplateBean createTemplateBean;

  @ManagedProperty(value = "#{configurationManagementBean}")
  private ConfigurationManagementBean configurationManagementBean;

  public void createTreeByUserRole() {
    root = new DefaultTreeNode("Root", null);
    if (TreeNodesEnum.SUPER_USER.equals(loggedInUserRole)) {
      addCreateConfigurationNodes();
      addTemplateAdministrationNodes();
      addUserAdministrationNodes();

    } else if (TreeNodesEnum.ADMIN_USER.equals(loggedInUserRole)) {
      addCreateConfigurationNodes();
      addTemplateAdministrationNodes();

    } else if (TreeNodesEnum.NORMAL_USER.equals(loggedInUserRole)) {
      addCreateConfigurationNodes();
    }
  }

.....................

1 个答案:

答案 0 :(得分:0)

使用@Component,您使用的是spring mvc bean而不是JSF bean。您可以切换到JSF bean或使用Spring作用域,例如@Scope(" session")。