Как долго вы храните сессионные куки? - PullRequest
5 голосов
/ 24 апреля 2010

Я реализую веб-приложение, которое использует сессии. Я использую GWT и механизм приложений в качестве моего клиента / сервера, но я не думаю, что они делают что-то действительно отличное от того, что я делал бы с PHP, apache и т. Д.

Когда пользователь входит в мое веб-приложение, я использую HttpSession, чтобы начать сеанс для них. Я получаю идентификатор сессии, как это:

// From my login servlet:
getThreadLocalRequest().getSession(false).getId();

Я возвращаю sessionId обратно клиенту, и они сохраняют его в файле cookie. Урок, который я использую, устанавливает срок действия этого файла cookie через две недели:

Cookie.write("sid", theSessionId, 1000 * 60 * 60 * 24 * 14); // two weeks

Вот где я запутался: если срок действия файла cookie истекает через две недели, тогда мой пользователь с радостью воспользуется веб-приложением, только однажды зайдет на мой сайт и будет показан экран входа в систему. Какие у меня варианты? Могу ли я просто установить срок действия этого cookie? Таким образом, пользователь должен был бы явно выйти из системы, иначе он мог бы просто использовать приложение навсегда, не выполняя вход снова?

Или есть лучший способ сделать это? Я не могу вспомнить, чтобы такие сайты, как Twitter, когда-либо просили меня снова войти в систему. Я, кажется, постоянно вошел в систему. Они просто не имеют срока действия?

Веб-приложение не защищает какие-либо высокочувствительные данные, поэтому я не против оставить файл cookie, срок действия которого не истекает, но кажется, что должен быть лучший способ?

Это учебник, на который я ссылаюсь:

http://code.google.com/p/google-web-toolkit-incubator/wiki/LoginSecurityFAQ

Спасибо

1 Ответ

3 голосов
/ 24 апреля 2010

HttpSession скрыт за кулисами, уже поддерживаемыми cookie. Проверьте список файлов cookie браузера с именем jsessionid. Кроме того, при получении экземпляра вы должны вызывать getSession() без false, иначе вы можете рискнуть NullPointerException, если он еще не создан и, следовательно, вернет null.

Когда вы входите в систему, вы обычно помещаете вошедший в систему User в сеанс.

User user = userDAO.find(username, password);
if (user != null) {
    session.setAttribute("user", user);
} else {
    // Handle error "Unknown username/password combo."
}

Вы можете разрешить перехвату вашего веб-приложения вошедшего в систему User, просто проверив его присутствие в сеансе. Например, в Filter, который вы хотите использовать для блокировки защищенных страниц.

if (session.getAttribute("user") == null) {
    response.sendRedirect("login"); 
} else {
    chain.doFilter(request, response);
}

В большинстве веб-контейнеров значение HttpSession по умолчанию составляет 30 минут. Другими словами, он истекает через 30 минут после последнего запроса. Это настраивается в web.xml следующим образом:

<session-config>
    <session-timeout>10</session-timeout>
</session-config>

Где время ожидания указывается в минутах (например, 10 минут в приведенном выше примере).

Если вы хотите предоставить (автоматически) опцию «Запомнить меня на этом компьютере», то вам нужно создать еще один файл cookie с другим идентификатором. Ранее я уже публиковал ответ, в котором подробно об этом говорится: Java - Как я могу держать пользователя на моем сайте в течение нескольких месяцев?

...