English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Подробное руководство по управлению сеансами в JavaWeb

Краткое введение в сеанс (Session)

Сеанс - это процесс взаимодействия пользователя с веб-приложением в течение определенного периода времени, когда пользователь использует один и тот же процесс браузера.

Сеанс (Session) обычно используется для отслеживания состояния пользователя, кэширования информации пользователя в процессе браузера.

Когда пользователь закрывает браузер, предыдущий сеанс уже не может быть повторно получен (Cookie maxAge равен -1). При повторном открытии нового браузера начнется новый сеанс.

Класс javax.servlet.http.HttpSession. Каждый HttpSession представляет сеанс пользователя.
Время жизни каждого сеанса по умолчанию составляет 30 минут.

Когда браузер впервые посещает сервер, неважно,哪个页面访问在先,сервер предоставляет пользователю уникальный идентификатор сеанса, то есть jsessionid, и возвращает его в виде cookie.
Ниже приведен пример заголовка ответа (ниже приведен на основе Servlet 3.0, в Servlet 2.5 нет свойства HttpOnly)

Сервер создает сеанс для каждого пользователя, то есть объект HttpSession, который хранится на сервере.

Тогда, как сервер знает, что это все еще текущий пользователь, когда пользователь снова посещает сервер?

Когда браузер снова посещает сервер, он携带包含jsessionid cookie, чтобы访问服务器。Сервер возвращает объект HttpSession для этого пользователя на основе этого id, чтобы поддерживать сеанс.
Тогда, можно ли реализовать одинаковый сеанс на разных браузерах?

Ниже приведен пример типичного URL, который具有一定的欺骗性, и можно реализовать одинаковый сеанс на разных браузерах:

http://localhost:8080/day07_2/CNCookieServlet;jsessionid=F8692D61CD46D094DBB7A8FC7387649C )

Отношение браузера и сервера показано на следующих двух рисунках:


HttpSession:

В Servlet сеанс объект получен с помощью метода HttpServletRequest.getSession.

Следующие методы интерфейса HttpSession используются для обмена данными в диапазоне сеанса:

getAttribute(“name”)
setAttribute(“name”,object);
getAttributeNames()
removeAttrubute(“name”)

Invalidate(); - Этот метод силой удаляет сеанс, хранящийся на сервере.

Пример:

В Servlet устанавливаются некоторые значения в httpSession с помощью метода setAttribute.

Через гиперссылку или другие методы перейти к другому servlet и отобразить информацию через getAttribute.

В любом Servlet можно вызвать getAttribute для отображения информации.

Закройте этот браузер, заново посетите servlet для получения информации, и вы会发现, что информации больше нет.

Вот так:

String name=request.getParameter("name"); 
request.setAttribute("name", "request---"+name); 
request.getSession().setAttribute("name", "session---"+name); 
getServletContext().setAttribute("name", "application---"+name); 

Уникальный идентификатор сеанса Id:

У каждого сеанса есть уникальный идентификатор, то есть ID.

Когда браузер получает новый сеанс, пользователь может через session.geId() напечатать значение ID.

При переходе по нескольким страницам без закрытия браузера используется один и тот же сеанс.

Например:

request.getSession().getId() 

Что такое безопасный выход:

При выходе пользователя должны быть удалены его данные из сеанса - это безопасный выход.

Безопасный выход предназначен для удаления всех оставленных на сервере данных, чтобы предотвратить взлом

Session.invalidate();

1、request.getSession().invalidate();

Таким образом, можно удалить соответствующий объект из пула сеансов

2、Session.removeAttribute(…)

Например:

request.getSession().removeAttribute("realCode");

Для удаления атрибутов из объекта сеанса

Отслеживание сеанса через переработку URL:

Как уже говорилось, контейнер Servlet сначала сохраняет SessionID на клиенте, а затем, при отправке браузером HTTP-запроса, этот SessionID всегда включается в запрос. Контейнер Servlet читает этот SessionID из HTTP-запроса, находит HttpSession объект по этому SessionID в контейнере, чтобы отслеживать,哪一个 сеанс принадлежит данному HTTP-запросу, этот процесс называется отслеживанием сеанса.

Если браузер поддерживает Cookie, контейнер Servlet сохраняет SessionID в виде Cookie на клиенте браузера. Но если пользователь отключил Cookie по соображениям безопасности, как контейнер Servlet будет отслеживать сеанс?

Давайте начнем с отключения Cookie в IE (замечание: это не работает на некоторых системах GHOST).

IE>Инструменты>Параметры Интернета>Конфиденциальность>Дополнительные, затем отключите Cookie:

Мы можем добавить такую гиперссылку на главной странице: (код SaveServlet.java GetServlet.java LogoutServlet.java, связанный с этим, я поместил в конце)

<h2>Демонстрация технологии переписывания URL - решение проблемы с сессией, когда пользователь отключает cookie</h2> 
<form action="<%=response.encodeURL("saveServlet") %>" method="post"> 
name:<input type="text" name="name"/><br/> 
<input type="submit"/> 
</form> 
<a href="<%=response.encodeURL("getServlet") %>">Переписать URL - чтение данных из нескольких контейнеров</a><br/> 
<a href="<%=response.encodeURL("logoutServlet") %>">Переписать URL - безопасный выход</a> 

Эта команда <form action=“<%=response.encodeURL(“/aa”)%>”> позволяет выполнить эту функцию

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

Этот код позволяет ввести желаемое значение в форму, а затем перейти по ссылке getServlet, чтобы проверить, отображается ли введенное значение. Ответ — да. Этот путь доступа аналогичен

http://localhost:8080/day07_2/CNCookieServlet;jsessionid=F8692D61CD46D094DBB7A8FC7387649C jsessionid=F8692D61CD46D094DBB7A8FC7387649C — это его идентификатор. Таким образом, вы можете перейти в другой браузер и ввести этот URL, и вы также сможете получить доступ к нему.
Здесь я хочу добавить: (Следующие условия достигаются, когда я записываю значение JSESSIONID и value объекта HttpSession в cookie, который заменяет системный cookie, то есть я создаю его сам. Я установил время хранения в десять минут, если его не заменить, cookie исчезнет при закрытии браузера, и下面的现象就不会出现).

В зависимости от того, был ли отключен cookie, идентификатор объекта, созданного в pool session, будет不一样, то есть, если вы ввели значение name в форме, когда cookie был отключен, результаты поиска будут такими:

и jsessionid будет 2BB51EBDEAAF14D19656C71E1B6F9FF6

Затем сразу же переключимся на режим, когда cookie не отключены, введите другое имя, например, Tom, и результаты поиска будут два Tom, jsessionid будет

203F9E4DB5D874476B81DAF350661B6A, это отличается от отключенного режима, что привело к следующим результатам

Затем мы закроем браузер, снова откроем его и проверим результаты доступа в режиме, когда cookie не отключены, как показано ниже:

Вот основные коды, которые я собираюсь показать:

SaveServlet.java

package cn.hncu.servlets.session; 
import java.io.IOException; 
import java.io.PrintWriter; 
import javax.servlet.ServletException; 
import javax.servlet.http.Cookie; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
public class SaveServlet extends HttpServlet { 
public void doGet(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException { 
doPost(request, response); 
} 
public void doPost(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException { 
response.setContentType("text/html;charset=utf-8"); 
PrintWriter out = response.getWriter(); 
request.setCharacterEncoding("utf-8"); 
String name=request.getParameter("name"); 
request.setAttribute("name", "request---"+name); 
request.getSession().setAttribute("name", "session---"+name); 
getServletContext().setAttribute("name", "application---"+name); 
//Пример использования технологии cookie и технологии session для создания приложения---※Функция: Позволить пользователю получить доступ к информации в session, если он зайдет на сайт в течение 10 минут после закрытия браузера 
//Написатьcookie с ключом "JSESSIONID" и значением sessionid для клиента 
Cookie c=new Cookie("JSESSIONID", request.getSession().getId()); 
c.setMaxAge(60*10);//Это的现象就是这一句造成的,没有这一句的话就不会有上面说的现象了 
c.setPath(request.getContextPath()); 
response.addCookie(c); 
out.println("Сохранение успешно..."); 
out.flush(); 
out.close(); 
} 
}

GetServlet.java

package cn.hncu.servlets.session; 
import java.io.IOException; 
import java.io.PrintWriter; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
public class GetServlet extends HttpServlet { 
public void doGet(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException { 
response.setContentType("text/html;charset=utf-8"); 
PrintWriter out = response.getWriter(); 
out.println("<!DOCTYPE HTML PUBLIC \ 
out.println("<HTML>"); 
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>"); 
out.println(" <BODY>"); 
String reqName=(String) request.getAttribute("name"); 
String seName=(String) request.getSession().getAttribute("name"); 
String appName=(String) getServletContext().getAttribute("name"); 
out.println(reqName+"<br/>"); 
out.println(seName+"<br/>"); 
out.println(appName+"<br/>"); 
out.println(" </BODY>"); 
out.println("</HTML>"); 
out.flush(); 
out.close(); 
} 
}

LogoutServlet.java

package cn.hncu.servlets.session; 
import java.io.IOException; 
import java.io.PrintWriter; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
public class LogoutServlet extends HttpServlet { 
public void doGet(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException { 
response.setContentType("text/html;charset=utf-8"); 
PrintWriter out = response.getWriter(); 
//Безопасный выход --- достаточно сделать объект сессии неактивным 
request.getSession().invalidate(); 
out.println("Безопасный выход..."); 
} 
} 

Как уже сказал редактор, я介绍了JavaWeb Session сеансовое управление, надеюсь, это поможет вам. Если у вас есть какие-либо вопросы, пожалуйста, оставляйте комментарии, редактор ответит вам своевременно!

Заявление: содержимое этой статьи взято из Интернета, авторские права принадлежат соответствующему автору. Контент предоставлен пользователями Интернета, самостоятельно загружен, сайт не обладает правами собственности, не был отредактирован вручную и не несет ответственности за связанные с этим юридические вопросы. Если вы обнаружите содержимое,涉嫌侵犯版权, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (во время отправки письма замените # на @), и предоставьте соответствующие доказательства. Если факт будет подтвержден, сайт немедленно удалит涉嫌侵权的内容.

Основной учебник
Вам может понравиться