Время от бобов
Я хочу, чтобы время сеанса истекло после определенного интервала времени. В 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);