Как контролировать повторяющийся процесс входа в систему в шов
Мой проект использует 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()}" />
Теперь проблема была преодолена!!!!!