Struts2 - действительно ли invalidate () метода SessionMap делает недействительными сессии? - PullRequest
1 голос
/ 25 ноября 2011

Я использую в своих действиях SessionMap (org.apache.struts2.dispatcher.SessionMap<K,V>) для отслеживания моих сессий. Я также использую метод invalidate(), предоставленный SessionMap для выхода из системы.

Используя «менеджер» веб-приложений, предоставленный Tomcat, я могу отслеживать сеансы на моем сервере. Когда я хочу выйти из моего веб-приложения, я вызываю метод invalidate().

Но после вызова этого метода сеанс не истекает! Метод Invalidate() удаляет только объект, сохраненный в сеансе (например, объект пользователя, созданный после login(), но сеанс существует.

Надеюсь, мое объяснение понятно, как я могу решить эту проблему? заранее спасибо

Мой код:

public String execute(){

    User user = authenticateUser( getUsername(), getPassword() ); 
    if ( user == null )
    {
        /* User not valid, return to input page. */
        return INPUT;
    }
    else{
        session.put( "user", user );
    }

    return SUCCESS;
}

и я отменяю сессию следующим образом:

public String logout(){
    session.invalidate();   
    System.out.println("LOGOUT");
    return "logout";
}

где сессия:

private SessionMap<String, Object> session;

Ответы [ 2 ]

1 голос
/ 25 ноября 2011

Как вы отменяете сеанс, можете ли вы показать код?один из способов аннулировать сессию -

// Code fragment from class implementing SessionAware containing the 
// session map in a instance variable "session". Attempting to invalidate 
// an already-invalid session will result in an IllegalStateException.
if (session instanceof org.apache.struts2.dispatcher.SessionMap) {
    try {
        ((org.apache.struts2.dispatcher.SessionMap) session).invalidate();
    } catch (IllegalStateException e) {
        logger.error(msg, e);
    }
}

Более того, я согласен с Dave, вы должны быть обеспокоены удалением конкретного экземпляра из сессии

1 голос
/ 25 ноября 2011

Сеанс создается, как только осуществляется доступ к JSP, если вы явно не сконфигурируете JSP, чтобы не создавать сеансы, плюс перехватчик сеанса S2 создаст один (если ваш стек включает его).

Это говоритудаление известного объекта из сеанса должно быть всем, что требуется для указания того, вышел ли человек из системы - полагаться на отсутствие сеанса требует слишком много дополнительной работы и довольно хрупко - просто забытьчтобы указать странице JSP не создавать сеанс, он будет создан.

Гораздо чище и надежнее сохранять что-то вроде User объекта в сеансе, пока пользователь вошел в систему.

...