Манипуляция сессиями в JSP


Сессии были введены в предыдущем разделе, посвященном сервлетам и также доступны в JSP. Следующие примеры исследуют сессионные объекты и позволяют вам манипулировать промежутком времени, прежде, чем сессия станет недействительной.

//:! c15:jsp:SessionObject.jsp

<%-- Получение и установка значений объекта сессии --%>

<html><body>

<H1>Session id: <%= session.getId() %></H1>
<H3>
    <li>This session was created at 
    <%= session.getCreationTime() %>
    </li>
</H1>

<H3>
    <li>
        Old MaxInactiveInterval = <%= session.getMaxInactiveInterval() %>
    </li>

    <% session.setMaxInactiveInterval(5); %>
    <li>
        New MaxInactiveInterval= <%= session.getMaxInactiveInterval() %>
    </li>
</H3>

<H2>If the session object "My dog" is still around, this value will be non-null:<H2>
<H3>
    <li>
        Session value for "My dog" = <%= session.getAttribute("My dog") %>
    </li>
</H3>

<%-- Теперь добавим объект сессии "My dog" --%>

<% session.setAttribute("My dog", new String("Ralph")); %>

<H1>My dog's name is <%= session.getAttribute("My dog") %></H1>

<%-- See if "My dog" wanders to another form --%>

<FORM TYPE=POST ACTION=SessionObject2.jsp>
<INPUT TYPE=submit name=submit Value="Invalidate"><
/FORM>

<FORM TYPE=POST ACTION=SessionObject3.jsp>
<INPUT TYPE=submit name=submit Value="Keep Around">
</FORM>
</body></html>
///:~

Объект сессии предоставляется по умолчанию, так что он доступен без дополнительного кода. Вызов getID( ), getCreationTime( ) и getMaxInactiveInterval( ) используются для отображения информации об этом сессионном объекте.

Когда вы в первый раз получите эту сессию, вы увидите, что MaxInactiveInterval составляет, например, 1800 секунд (30 минут). Это зависит от конфигурации вашего контейнера JSP/сервлетов. MaxInactiveInterval сокращается до 5 секунд, чтобы сделать вещи интереснее. Если вы перегрузите страницу до того, как истекут 5 секунд, то вы увидите:

Session value for "My dog" = Ralph


Но если вы подождете больший интервал, то "Ralph" станет null.

Чтобы посмотреть, как сессионная информация переносится на другие страницы, а также, чтобы посмотреть эффект становления объекта сессии недействительным по сравнению с простым вариантом, когда вы дали ему устареть, созданы две новые страницы. Первая (доступна при нажатии кнопки "invalidate" в SessionObject.jsp) читает сессионную информацию, а затем явно делает сессию недействительной:

//:! c15:jsp:SessionObject2.jsp
<%-- Объект сессии переноситься --%>
<html>
<body>
<H1>Session id: <%=session.getId()%></H1>
<H1>Session value for "My dog" <%=session.getValue("My dog")%></H1>
<%
    session.invalidate();
%>
</body>
</html>
///:~

Чтобы экспериментировать с этим, обновите SessionObject.jsp, затем сразу же кликните на кнопку "invalidate", чтобы перейти к странице SessionObject2.jsp. В этом месте вы все еще будете видеть "Ralph" и сразу после этого (прежде, чем пойдет интервал в 5 секунд), обновите SessionObject2.jsp, чтобы увидеть, что сессия была успешно сделана недействительной и "Ralph" исчез.

Если вы вернетесь на SessionObject.jsp, обновите страницу так, чтобы вы снова имели 5-ти секундный интервал, затем нажмете кнопку "Keep Around", то вы попадете на следующую страницу SessionObject3.jsp, которая не делает сессию недействительной:

//:! c15:jsp:SessionObject3.jsp

<%-- Переход объекта сессии по страницам --%>

<html>
<body>

<H1>Session id: <%=session.getId()%></H1>

<H1>Session value for "My dog" <%=session.getValue("My dog")%></H1>

<FORM TYPE=POST ACTION=SessionObject.jsp><INPUT TYPE=submit name=submit Value="Return"></FORM>

</body>
</html>

///:~

Поскольку эта страница не делает сессию недействительной, "Ralph" будет оставаться во время каждого обновления страницы до тех пор, пока не пройдет 5-ти секундный интервал между обновлениями. Это мало чем отличается от игрушки "Tomagotchi" - до тех пор, пока вы играете с "Ralph", он будет здесь, в противном случае он исчезнет.