Как контролировать повторяющийся процесс входа в систему в шов

Мой проект использует JSF2.0, Seam 2.3 и Spring 3.0

Процесс входа разрабатывается Seam Security.

Моя проблема заключается в том, чтобы контролировать дубликат входа пользователя следующим образом:

Time1: пользователь A @PC1 >>>>>> войти в систему с ИД пользователя: 11111 >>>>>>>>>> (статус: ОК)

Time2: пользователь B @PC2 >>>>>> войти в систему с ИД пользователя: 11111 >>>>>>>>>> (статус: ОК)

В настоящее время я хотел бы автоматически аннулировать и выйти User A из системы

Как я могу это сделать, и любое предложение приветствуется

2 ответа

Создайте javax.servlet.http.HttpSessionListener и добавьте его в свой веб-XML.

сохранить всю сессию в списке.

public class SessionListener implements HttpSessionListener, java.io.Serializable{
    private static final Logger log = Logger.getLogger(SessionListener.class);
    public void sessionCreated(HttpSessionEvent event) {
        listsession.add(event.getSession());
    }

    public void sessionDestroyed(HttpSessionEvent event) {
        listsession.remove(event.getSession());
    }
}

Когда новый сеанс регистрируется для сравнения, если в списке есть существующий с тем же пользователем. и использовать invalidateSession на нем. можно использовать что-то подобное, чтобы получить компоненты шва из сеанса

    for(HttpSession session:listsession){
        if (session!=null)
        {
            Identity identity = null;
            Credentials credentials = null;
            Object attribute = session.getAttribute("org.jboss.seam.security.identity");
            if (attribute instanceof Identity) 
            {
                identity = (Identity) attribute;
            }
            Object cred = session.getAttribute("org.jboss.seam.security.credentials");
            if (attribute instanceof Credentials) 
            {
                credentials = (Credentials) cred;
            }

        }   
    }

Я решил эту проблему с помощью следующей идеи:

Первый кулак LoginUserMap а также LoginUserKeyMap на сессию Scope при входе пользователя.

LoginUserKeyMap хранить идентификатор пользователя с системным ключом.

Например: [ключ: пользователь1, значение: пользователь120131010154566]

LoginUserMap для хранения вошедшего в список информации пользователя.

Например: [ключ:user120131010154566, значение: объект]

/**
 * Bijection Login User Map.
 */
@In(required = false, scope = ScopeType.APPLICATION, value = "loginUserMap")
@Out(required = false, scope = ScopeType.APPLICATION, value = "loginUserMap")
private Map<String, UserInfoBean> loginUserMap;

/**
 * Bijection Login User Key Map.
 */
@In(required = false, scope = ScopeType.APPLICATION, value = "loginUserKeyMap")
@Out(required = false, scope = ScopeType.APPLICATION, value = "loginUserKeyMap")
private Map<String, String> loginUserKeyMap;

public void doLogin() {

    // Generate User ID Key for duplicate user control.
    String key = CommonUtil.convertDateToString(new Date(), KEY_PATTERN);
    String userId = getCredentials().getUsername();
    String userIdKey = userId + key;

    if (getLoginUserMap() == null || getLoginUserKeyMap() == null) {

        // Initialize the Login User Map.
        setLoginUserMap(new HashMap());

        // Initialize the Login User Key Map.
        setLoginUserKeyMap(new HashMap());
    }

    // Check login User id is already login or not.
    if (getLoginUserKeyMap().containsKey(userId)) {

        log.info("Duplicate Login");

        // Get Current logged in User's Key.
        String CurrentUserKey = getLoginUserKeyMap().get(userId);

        // Get Current logged in User Information.
        UserInfoBean currentUserInfoBean = getLoginUserMap().get(CurrentUserKey);

        if (currentUserInfoBean != null) {

            // Set Duplicate flag true to Current logged User.
            currentUserInfoBean.setDuplicate(true);

            // Overwrite Current logged User Information.
            getLoginUserMap().put(CurrentUserKey, currentUserInfoBean);
        }

    }

    // Set New Login User Information.
    getUserInfoBean().setUserId(userId);
    getUserInfoBean().setUserIdKey(userIdKey);
    getUserInfoBean().setDuplicate(false);
    getUserInfoBean().setServiceStop(false);

    // Set New Login User Information and Key to Application Scope.
    getLoginUserKeyMap().put(userId, userIdKey);
    getLoginUserMap().put(userIdKey, getUserInfoBean());

}

А затем создать checkStatus() метод

public void checkStatus() throws DuplicateLoginException, UserServiceStopException {

    if (getUserInfoBean() != null && getLoginUserMap() != null) {

        UserInfoBean currentUser = getLoginUserMap().get(getUserInfoBean().getUserIdKey());

        if (currentUser != null) {
            if (currentUser.isServiceStop()) {
                log.error("throw new UserServiceStopException()");
                throw new UserServiceStopException();

            } else if (currentUser.isDuplicate()) {
                log.error("throw new DuplicateLoginException()");
                throw new DuplicateLoginException();
            }
        }
    }
}

И называть это checkStatus() метод с каждой страницы.

 <page view-id="/view/*">
    <action execute="#{UserStatusChecker.checkStatus()}" />

Теперь проблема была преодолена!!!!!

Другие вопросы по тегам