1. Краткое введение в сеанс
В веб -разработке сервер может создать объект сеанса (объект сеанса) для браузера каждого пользователя. Примечание: браузер владеет исключительно объектом сеанса (по умолчанию). Поэтому, когда необходимо сохранить пользовательские данные, серверная программа может записать пользовательские данные в сеанс, эксклюзивный для браузера пользователя. Когда пользователь использует браузер для доступа к другим программам, другие программы могут извлечь данные пользователя из сеанса пользователя для обслуживания пользователя.
2. Основные различия между сеансом и куки
Файлы cookie - это браузер, который записывает данные пользователя пользователям.
Технология сеанса записывает пользовательские данные в сеансы, принадлежащие пользователю.
Объект сеанса создается сервером, и разработчики могут вызвать метод GetSession объекта запроса, чтобы получить объект сеанса.
3. Принцип реализации сеанса
3.1. Как сервер реализует сеанс для обслуживания браузера пользователя?
После того, как сервер создаст сеанс, он напишет идентификационный номер сеанса обратно клиенту в виде cookie. Таким образом, до тех пор, пока браузер клиента не закрыт при доступе к серверу, он принесет идентификационный номер сеанса. Когда сервер обнаруживает, что клиентский браузер имеет идентификатор сеанса, он будет использовать соответствующий сеанс в памяти для его обслуживания. Это может быть доказано следующим кодом:
пакет xdp.gacl.session; импорт java.io.ioexception; import javax.servlet.servletexception; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.htpsevonse; javax.servlet.http.httpsession; import javax.servlet.http.httpsession; import javax.servlet.http.httpsession; открытый сессия класса. response.setcharacterencoding ("utf = 8"); response.setContentType ("text/html; charset = utf-8"); // Использование getSession () объекта запроса для получения сеанса. Если сеанс не существует, создайте сеанс httpsession = request.getSession (); // хранение данных в сеансе Session.SetAttribute («Data», «Lonely Canglang»); // Получить идентификатор строки сеанса sessionId = session.getId (); // Судите, является ли сеанс вновь создан, if (session.isnew ()) {response.getWriter (). Print («Сессия была успешно создана, идентификатор сеанса:«+sessionId); } else {response.getWriter (). Print ("Сеанс уже существует на сервере, идентификатор сеанса:"+sessionId); }} public void dopost (httpservletrequest -запрос, httpservletresponse response) throws servletexception, ioexception {Doget (запрос, ответ); }}При первом доступе сервер создаст новый сеанс и отправит идентификатор сеанса в браузер клиента в виде cookie, как показано на рисунке ниже:
Нажмите кнопку обновления и снова запросите сервер. В настоящее время вы можете видеть, что когда браузер снова запрашивает сервер, идентификатор сеанса, хранящийся в файле cookie, будет передаваться на сторону сервера, как показано на рисунке ниже:
Я предполагаю, что метод запроса.getSession () должен был выполнить следующую обработку после недавно созданного сеанса внутри
// Получить сеанс idString sessionId = session.getId (); // Хранение идентификатор сеанса в cookie с именем jsessionId cookie cookie = new cookie ("jsessionId", sessionId); // Установить действительный путь cookie cookie.setPath (request.getContextPath ()); response.addcookie (cookie);4. Обработка сеанса после браузера отключает файлы cookie
4.1. IE8 Отключить куки
Инструменты -> Параметры Интернета -> Конфиденциальность -> Настройки -> Потяните слайдер вверх (заблокируйте все файлы cookie)
4.2. Решение: переписывание URL
response.encoderedirecturl (java.lang.string url) используется для переписывания адреса URL -адреса после метода SendRieRect.
response.encodeurl (java.lang.string url) используется для переписывания адреса URL -адреса действия и гиперссылки
4.3. Пример: после отключения файлов cookie, сервлеты делятся данными в сеансе
ИНДЕКССЕРВЛЕТ
Пакет xdp.gacl.session; импорт java.io.ioexception; import java.io.printwriter; импорт java.util.linkedhashmap; import java.util.map; импорт java.util.set; importm.servlet.servletexception; import.servlet.http.httpsple.servlet.servletexcept javax.servlet.http.httpservlectrequest; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletrespons Httpservletresponse response) throws servletexception, ioexception {response.setContentType ("text/html; charset = utf-8"); Printwriter Out = response.getWriter (); // Создать запрос сеанса.getSession (); out.write («На этом сайте есть следующие книги: <br/>»); SET <Map.Entry <String, book >> set = db.getall (). IntrySet (); for (map.Entry <String, book> me: set) {book book = me.getValue (); String url = request.getContextPath () + "/servlet/buyservlet? Id =" + book.getid (); //ответ. Encodeurl (java.lang.string url) используется для переписывания действия формы и URL -адреса url гиперссылки = response.encodeurl (url); // Переписать адрес URL -адреса HyperLind Out.println (book.getName ()+"<a href = '"+url+"'> купить </a> <br/>"); }} public void dopost (httpservletrequest -запрос, httpservletresponse response) throws servletexception, ioexception {Doget (запрос, ответ); }}/*** @author gacl* Симулировать базу данных*/class db {private static map <string, book> map = new LinkedHashmap <string, book> (); static {map.put ("1", новая книга ("1", "Javaweb Development")); map.put ("2", новая книга ("2", "Spring Development")); map.put ("3", новая книга ("3", "Hibernate Development")); map.put ("4", новая книга ("4", "Разработка стойки")); map.put ("5", новая книга ("5", "Ajax Development")); } public Static Map <String, book> getAll () {return Map; }} Класс Книга {Private String ID; Приватное название строки; public book () {super (); } public Book (String Id, String name) {super (); this.id = id; this.name = name; } public String getId () {return id; } public void setId (String id) {this.id = id; } public String getName () {return name; } public void setName (string name) {this.name = name; }}Покупатель
Пакет xdp.gacl.session; импорт java.io.ioexception; import java.util.arraylist; импорт java.util.list; import javax.servlet.servletexception; импорт javax.servlet.http.httpservlet; import javax.servlet.httplet.httplecervelt; javax.servlet.http.httpservletresponse; import javax.servlet.http.httpsession; public class buyservlet exters httpservlet {public void doget (httpservletrequest, httpservelponse response) throws servletexception {string ydetraMersponse); Book Book = db.getall (). Get (id); // Получить книгу, которую пользователь хочет купить httpsession session = request.getsession (); List <book> list = (list) session.getattribute ("list"); // Получить контейнер, используемый пользователем для сохранения всех книг, если (list == null) {list = new ArrayList <book> (); session.setattribute ("list", list); } list.add (book); //ответ. Encoderedirecturl (java.lang.string url) используется для переписывания адреса URL после SendRieRect метод string url = response.encoderedirecturl (request.getContextPath ()+"/servlet/listcartservlet"); System.out.println (url); response.sendredirect (url); } public void Dopost (httpservletRequest, httpservletresponse response) Throws ServletException, ioException {Doget (запрос, ответ); }}ListCartServlet
Пакет xdp.gacl.session; импорт java.io.ioexception; import java.io.printwriter; импорт java.util.list; import javax.servlet.servletexception; импорт javax.servlet.http.httpservlet; import javax.servlet.httplet.httplecervelt; javax.servlet.http.httpservletresponse; import javax.servlet.http.httpsession; public class listcartservlet расширяет httpservlet {public void doget (httpservletrequest, httpservletrespons response.setContentType ("text/html; charset = utf-8"); Printwriter Out = response.getWriter (); Httpsession session = request.getsession (); List <book> list = (list) session.getattribute ("list"); if (list == null || list.size () == 0) {out.write ("Извините, вы еще не приобрели продукты !!"); возвращаться; } // Показать продукты, приобретенные пользователем out.write («Вы купили следующие продукты: <br>»); для (книга книги: список) {out.write (book.getName () + "<br/>"); }} public void dopost (httpservletrequest -запрос, httpservletresponse response) throws servletexception, ioexception {Doget (запрос, ответ); }}Эффект работы в рамках IE8 с отключенными файлами cookie выглядит следующим образом:
Демонстрационный эффект
Посмотрев на код HTML, сгенерированный IndexServlet, вы можете видеть, что у каждой гиперссылки есть идентификатор сеанса, за которым следует, как показано ниже
// На этом веб -сайте есть следующие книги: <br/> javaweb development <a href = '/javaweb_session_study_20140720/servlet/buyservlet; jsessionId = 96bdfb9d87a08d5ab1eaa2537cde2db2? href = '/javaweb_session_study_20140720/servlet/buyservlet; jsessionId = 96bdfb9d87a08d5ab1eaa2537cde2db2? href = '/javaweb_session_study_20140720/servlet/buyservlet; jsessionId = 96bdfb9d87a08d5ab1eaaa2537cde2db2? id = 3'> покупка </a> <br/> // struts development <a href = '/javaweb_session_study_20140720/servlet/buyservlet; jsessionId = 96bdfb9d87a08d5ab1eaa2537cde2db2? id = 4'> покупка </a> <br/> // ajax development href = '/javaweb_session_study_20140720/servlet/buyservlet; jsessionId = 96bdfb9d87a08d5ab1eaa2537cde2db2? id = 5'> покупка </a> <br/>
Следовательно, когда браузер отключает файлы cookie, он может переписать это решение с URL -адресами для решения проблемы обмена данными сеанса. Более того, ответ. Encoderedirecturl (java.lang.string url) и ответ. Encodeurl (java.lang.string url) - два очень умных метода. Когда обнаружено, что браузер не отключает файлы cookie, переписывание URL не будет выполнено. Мы получаем доступ к нему в браузере Firefox без отключения файлов cookie, эффект заключается в следующем:
Как видно из демонстрационной анимации, когда браузер сначала обращается, сервер создает сеанс, а затем отправляет идентификатор сеанса обратно в браузер в виде cookie. Ответ. Encodeurl (java.lang.string url) также переписывал URL. Когда кнопка обновления нажимается для второго посещения, браузер Firefox не отключает файлы cookie, поэтому он приносит печенье во втором посещении. В настоящее время сервер может знать, что текущий клиент -браузер не отключает файлы cookie, поэтому он уведомляет ответ. Encodeurl (java.lang.string url), который не должен переписать URL.
5. Время создания и уничтожения объектов сеанса
5.1. Объект времени создания сеанса
Новый сеанс будет создан, когда метод запроса.getSession () впервые вызовут в программе. Вы можете использовать метод isnew (), чтобы определить, является ли сеанс вновь создан.
Пример: создать сеанс
// Использование getSession () объекта запроса для получения сеанса. Если сеанс не существует, создайте httpsession session = request.getSession (); // Получить idstring sessionId = session.getId (); // Судить, является ли сеанс недавно создан if (session.isnew ()) {response.getWriter (). Print («сеанс был успешно создан. is: "+sessionId);}5.2. Время разрушения объекта сеанса
По умолчанию объект сеанса не используется в течение 30 минут, и сервер автоматически уничтожит сеанс. Время сбоя сеанса может быть настроено вручную в файле web.xml, например:
<? xml version = "1.0" Encoding = "utf-8"?> <web-app arser = "2,5" xmlns = "http://java.sun.com/xml/ns/javaee" xmlns: xsi = "http://www.w3.org/2001/xmlschema electan "/www.w3. xsi: schemalocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <sillan-mame> </display-iname> <deldeble-file> jesdal-file> videx> jesdal-file> jesdal-file> jesdal-file> <!-Установите действительное время сеанса: в минутах-> <session-config> <session-timeout> 15 </session-timeout> </session-config> </web-app>
Когда вам нужно вручную установить сеанс для сбоя в программе, вы можете вручную позвонить в метод Session.invalidate для уничтожения сеанса.
1 httpsession session = request.getsession ();
2 // Вручную вызовите метод Session.invalidate для уничтожения сеанса
3 session.invalidate ();
Выше приведено в этой статье, я надеюсь, что для всех будет полезно изучать сеанс.