Время от бобов

Я хочу, чтобы время сеанса истекло после определенного интервала времени. В web.xml я использовал такой код:

<session-config>   
  <session-timeout>20</session-timeout>   
</session-config>   

где 20 - период ожидания в минутах, который работает правильно.

То, что я хотел бы сделать, это сделать это программно, используя такой код внутри одного из моих bean-компонентов следующим образом:

@ManagedBean(name="login")   
@SessionScoped  
public class MyLoginBean implements HttpSessionListener, Serializable {   

    // private variables etc.   

    HttpServletRequest request;   
    HttpSession session  = request.getSession();   

    // Constructor
    public MyLoginBean() {   
        session.setMaxInactiveInterval(1200);   
    }   

// The rest of the code   

}  

где время ожидания здесь составляет 1200 секунд, то есть 20 минут. К сожалению, при открытии браузера, чтобы посмотреть приложение, оно выходит из строя с сообщением:

com.sun.faces.mgbean.ManagedBeanCreationException: Cant instantiate class: com.csharp.MyLoginBean. 

С последующим:

java.lang.NullPointerException 

Что я здесь не так делаю? я знаю это setMaxInactiveInterval() относится к конкретному сеансу, который в данном случае является бином входа в систему, а не всем, что является кодом в web.xml файл указывает. У меня есть несколько bean-компонентов, но имеет значение только время ожидания bean-компонента login.

Я использую JSF 2.0 с Glassfish 3.1.1 и Eclipse Indigo, поэтому некоторые советы будут очень благодарны.

1 ответ

NullPointerException имеет чрезвычайно простую причину. Это одно из самых простых исключений. Чтобы узнать о причине произвольного исключения, просто посмотрите в его javadoc. Все исключения Java имеют свои причины, объясненные в Javadoc. Вот выдержка из Javadoc NullPointerException:

Брошенный, когда приложение пытается использовать нуль в случае, когда объект требуется. Они включают:

  • Вызов метода экземпляра null объект.
  • Доступ или изменение поля null объект.
  • Принимая длину null как будто это был массив.
  • Доступ или изменение слотов null как будто это был массив.
  • Бросание null как если бы это было значение Throwable.

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

Ваша проблема вызвана пунктом 1. Здесь

HttpServletRequest request;   
HttpSession session  = request.getSession();   

ты пытаешься вызвать getSession() метод на null вместо бетона HttpServletRequest пример. На самом деле, вы должны были получить HttpServletRequest с помощью ExternalContext#getRequest() и назначил его request,

Однако, у вас есть большие проблемы: вы не должны использовать текущий запрос сервлета как свойство bean-объекта сессионной области (который дольше, чем HTTP-запрос!). Вы должны получить его внутри локальной области видимости потока (т. Е. Полностью внутри конструктора или блока метода). Вы также не должны позволять вашему управляемому компоненту JSF реализовывать HttpSessionListener, Это не имеет никакого смысла. В итоге у вас будет 2 экземпляра, один из которых будет создан как слушатель контейнером, а другой - как управляемый компонент JSF.

Просто так следует сделать:

@ManagedBean(name="login")
@SessionScoped
public class MyLoginBean implements Serializable {

    public MyLoginBean() {
        HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession();
        session.setMaxInactiveInterval(1200);
    }

    // ...
}

Или, если вы используете JSF 2.1, используйте тот, который предоставлен ExternalContext:

FacesContext.getCurrentInstance().getExternalContext().setSessionMaxInactiveInterval(1200);
Другие вопросы по тегам