Другие основные статьи по Java:Базовое изучение Java (справочник)
Обзор сессии
1.1 Что такое сеанс?
Сеанс можно просто понимать так: пользователь открывает браузер, щелкает несколько гиперссылок, получает доступ к нескольким веб-ресурсам на сервере, а затем закрывает браузер. Весь процесс называется сеансом. Независимо от того, сколько запросов отправляет браузер, он считается сеансом. , пока браузер не будет закрыт и сеанс не завершится.
Обратите внимание, что браузер эквивалентен телефону. Если вы используете браузер Firefox для доступа к серверу, это сеанс, а затем открываете браузер Google для доступа к серверу. Это другой сеанс, хотя он находится на том же компьютере. Один пользователь обращается, однако это два разных сеанса.
1.2, сеансовый механизм
Метод, обычно используемый в веб-программах для отслеживания всего сеанса пользователя. Обычно используемыми технологиями отслеживания сеансов являются файлы cookie и сеансы. Cookie определяет личность пользователя, записывая информацию на стороне клиента, а Session определяет личность пользователя, записывая информацию на стороне сервера.
2. Файлы cookie
Cookie — это клиентская технология, и программа записывает данные каждого пользователя в браузер пользователя в виде файла cookie. Когда пользователи используют браузер для доступа к веб-ресурсам на сервере, они вносят свои собственные данные. Таким образом, веб-ресурс работает с собственными данными пользователя. Поскольку файлы cookie сохраняются и передаются клиентским браузером, это называется технологией на стороне клиента.
2.1. Рабочий процесс файлов cookie
1) Сервлет создает файл cookie, сохраняет небольшое количество данных и отправляет их в браузер.
2) Браузер получает данные cookie, отправленные сервером, и автоматически сохраняет их в браузере.
3) При следующем посещении браузер автоматически отправит данные cookie на сервер.
2.2. Функции файлов cookie
1) Размер каждого файла cookie: 4кб, если больше 4кб, браузер его не распознает
2) Веб-сайт (веб-проект): отправить 20
3) Один браузер сохраняет общий размер: 300
4) Файлы cookie небезопасны и могут раскрывать информацию о пользователе. Браузеры поддерживают отключение файлов cookie.
5) Жизненный цикл по умолчанию: как и сеанс браузера, файл cookie уничтожается при закрытии браузера. --- Временные куки
cookie.setMaxAge(expiry);  //设置cookie被浏览器保存的时间。
      
expiry:单位秒,默认为-1,
expiry=-1:代表浏览器关闭后,也就是会话结束后,cookie就失效了,也就没有了。
expiry>0:代表浏览器关闭后,cookie不会失效,仍然存在。并且会将cookie保存到硬盘中,直到设置时间过期才会被浏览器自动删除,
expiry=0:删除cookie。不管是之前的expiry=-1还是expiry>0,当设置expiry=0时,cookie都会被浏览器给删除。
2.3. Работа с файлами cookie
Управление файлами cookie
  1)创建cookie:new Cookie(name,value)
  2)发送cookie到浏览器:HttpServletResponse.addCookie(Cookie)
  3)servlet接收cookie:HttpServletRequest.getCookies() 浏览器发送的所有cookie
cookie API
getName() 获得名称,cookie中的key
getValue() 获得值,cookie中的value
  setValue(java.lang.String newValue) 设置内容,用于修改key对应的value值。
  setMaxAge(int expiry) 设置有效时间【】
  setPath(java.lang.String uri) 设置路径【】  
  setDomain(java.lang.String pattern) 设置域名 , 一般无效,有浏览器自动设置,setDomain(".zyh.com")
    www.zyh.com / bbs.zyh.com 都可以访问
    a.b.zyh.com无法访问
    作用:设置cookie的作用范围,域名+路径在一起就构成了cookie的作用范围,上面单独设置的setPath有用,是因为有浏览器自动设置该域名属性,但是我们必须知道有这么个属性进行域名设置的
  isHttpOnly() 是否只是http协议使用。只能servlet的通过getCookies()获得,javascript不能获得。
  setComment(java.lang.String purpose) (了解)  //对该cookie进行描述的信息(说明作用),浏览器显示cookie信息时能看到
  setSecure(boolean flag) (了解)  是否使用安全传输协议。为true时,只有当是https请求连接时cookie才会发送给服务器端,而http时不会,但是服务端还是可以发送给浏览端的。
  setVersion(int v) (了解)  参数为0(传统Netscape cookie规范编译)或1(RFC 2109规范编译)。这个没用到,不是很懂
Меры предосторожности
Файлы cookie нельзя отправлять на китайском языке. Если вы хотите отправлять файлы на китайском языке, требуется специальная обработка.
Cookie cookie = new Cookie("country", URLEncoder.encode("中国", "UTF-8"));
response.addCookie(cookie);
//经过URLEncoding就要URLDecoding
String value = URLDecoder.decode(cookies[i].getValue(), "UTF-8");
3. Сессия
В WEB-разработке сервер может создавать объект сеанса (session object) для каждого пользовательского браузера, примечание: браузер имеет исключительно объект сеанса (по умолчанию)
Поэтому, когда пользовательские данные необходимо сохранить, серверная программа может записывать пользовательские данные в сеанс исключительно для браузера пользователя.Когда пользователь использует браузер для доступа к другим программам, другие программы могут извлекать данные пользователя из сеанса пользователя. , Пользовательские услуги.
3.1. Принцип сеанса
- Во-первых, когда браузер запрашивает у сервера доступ к веб-сайту, когда программе необходимо создать сеанс для запроса клиента, сервер сначала проверит, содержит ли уже запрос клиента идентификатор сеанса с именем SESSIONID.
- Если идентификатор сеанса уже включен, это означает, что сеанс был создан для клиента ранее, и сервер извлекает сеанс в соответствии с идентификатором сеанса и использует его.Если запрос клиента не содержит идентификатор сеанса, сервер создает сеанс для клиента и создает сеанс. Идентификатор сеанса, связанный с этим сеансом, значение sessionid должно быть строкой, которая не повторяется и не легко находит шаблоны для имитации. Этот идентификатор сеанса будет возвращен клиенту в этом ответе для сохранения, и значение этого sessionid будет сохранено.Путь вообще куки.
- Таким образом, в процессе взаимодействия браузер может автоматически отправить идентификатор обратно на сервер по правилам, а сервер может найти соответствующую сессию по sessionid, и вернуться к шагу 1.
3.2, жизненный цикл сеанса
Часто приходится слышать такое недоразумение «пока вы закрываете браузер, сессия пропадает». На самом деле, вы можете представить себе пример с членской картой.Если покупатель не возьмет на себя инициативу по аннулированию карты, магазин никогда не удалит информацию о покупателе с легкостью. То же самое верно и для сеансов.Если программа не уведомит сервер об удалении сеанса, сервер сохранит его.Программа обычно отправляет инструкцию удалить сеанс, когда пользователь выходит из системы. Однако браузер никогда активно не информирует сервер о том, что он будет закрыт перед закрытием, поэтому у сервера нет шансов узнать, что браузер был закрыт.Причина этой иллюзии заключается в том, что большинство механизмов сеанса используют файлы cookie сеанса для сохранения идентификатора сеанса. , а идентификатор сеанса исчезает после закрытия браузера, а исходный сеанс невозможно найти при повторном подключении к серверу. Если файл cookie, установленный сервером, сохраняется на жестком диске или используется какой-либо метод для перезаписи заголовка HTTP-запроса, отправленного браузером, и исходный идентификатор сеанса отправляется на сервер, исходный сеанс все равно можно найти, открыв снова браузер.
Именно потому, что закрытие браузера не приведет к удалению сеанса, вынуждая сервер установить время истечения сеанса, обычно 30 минут.Когда время, прошедшее с момента последнего использования сеанса клиентом, превышает это время истечения, сервер может рассмотреть клиент. Сеанс будет удален для экономии места для хранения, когда активность будет остановлена. После создания сеанса, пока пользователь продолжает доступ, сервер будет обновлять время последнего доступа к сеансу.Независимо от того, был ли сеанс прочитан или записан, сервер будет считать сеанс активным один раз и перезапустить расчет времени экспирации.
Мы также можем сами контролировать допустимое время сеанса:
session.invalidate()将session对象销毁
setMaxInactiveInterval(int interval) 设置有效时间,单位秒
Настройте эффективное время сеанса в web.xml:
<session-config>
<session-timeout>30</session-timeout> 单位:分钟
<session-config>
Поэтому, после столь долгого обсуждения, жизненный цикл сессии таков:
Создайте: Сессия хранится на стороне сервера и обычно размещается в памяти сервера (для высокоскоростного доступа).Сессинон создается при первом доступе пользователя к серверу.Следует отметить, что Сессия будет создана только при доступ к таким программам, как JSP и Servlet. Статические ресурсы, такие как HTML и IMAGE, не создают сеанс. Вы можете вызвать request.getSession(true), чтобы принудительно создать сеанс.
разрушать:
1) Время ожидания, по умолчанию 30 минут.
2) Выполните api: session.invalidate(), чтобы уничтожить объект сеанса, setMaxInactiveInterval(int interval), чтобы установить допустимое время, единица измерения: секунда
3) Сервер аварийно выключен (самоубийство, немедленно закрыть JVM)
При нормальном закрытии сессия будет сохранена (записана в файл, т.к. тайм-аут сессии по умолчанию составляет 30 минут, после нормального закрытия сессия будет сохранена и через 30 минут будет удалена)
Расположение: D:\java\tomcat\apache-tomcat-7.0.53\work\Catalina\localhost\test01\SESSIONS.ser
3.3, перезапись URL-адреса идентификатора сеанса
Когда файлы cookie отключены в браузере, сеансы на основе файлов cookie не будут работать должным образом, и каждый раз при использовании request.getSession() будет создаваться новый сеанс. Он не может достичь цели обмена данными сеанса, но мы знаем принцип, просто передайте идентификатор сеанса сеансу сервера для нормальной работы.
Решение: передать идентификатор сеанса на сервер через URL-адрес: перезапись URL-адреса.
1) Ручной способ: url;jsessionid=....
2) способ API:
encodeURL(java.lang.String url) 进行所有URL重写
encodeRedirectURL(java.lang.String url) 进行重定向 URL重写
Эти два использования в основном одинаковы, но, учитывая особые обстоятельства, ссылка, к которой нужно получить доступ, может быть перенаправлена на другие сервлеты для обработки, так что информация об идентификаторе сеанса, которую вы приносите с помощью вышеуказанного метода, не может быть передана другим сервлетам одновременно. В это время вы можете использовать метод encodeRedirectURL(). Если браузер отключит cookie, API автоматически добавит идентификатор сеанса, если нет, API не внесет никаких изменений.
Примечание. Если браузер отключает файлы cookie, все URL-адреса веб-проектов необходимо будет переписать. В противном случае сеанс не будет работать должным образом.
Когда файлы cookie отключены:
В-четвертых, разница между Session и Cookie
4.1, из сравнения методов хранения
Файлы cookie могут хранить только строки и кодировать строки, отличные от ASCII, если они должны быть сохранены.
Сеанс может хранить данные любого типа, вы можете думать о сеансе как о контейнере.
4.2 Сравнение конфиденциальности и безопасности
Файлы cookie хранятся в браузере и видны клиенту. Информация легко утекает. При использовании файлов cookie лучше всего зашифровать файл cookie.
Сеансы хранятся на сервере и прозрачны для клиента. Нет проблемы утечки конфиденциальной информации.
4.3 Сравнение со сроком действия
Файл cookie сохраняется на жестком диске, вам нужно только установить для атрибута maxAge относительно большое положительное целое число, даже если вы закроете браузер, файл cookie все еще существует.
Сеанс хранится на сервере, а значение атрибута maxInactiveInterval устанавливается для определения периода действия сеанса. И сеанс использует файл cookie с именем JSESSIONID, который имеет атрибут maxAge по умолчанию, равный -1. Если браузер закрыт, Сессия с сервера не умирает, но тоже недействительна.
4.4, из сравнения нагрузки на сервер
Сессия хранится на сервере, и каждый пользователь будет генерировать сессию.Если есть много пользователей с одновременным доступом, сессия не может быть использована, и сессия будет потреблять много памяти.
Файлы cookie хранятся на стороне клиента. Не занимает ресурсы сервера. Крупные веб-сайты, такие как baidu и Sina, обычно используют файлы cookie для отслеживания сеансов.
4.5 Сравнение с поддержкой браузера
Файлы cookie бесполезны, если в вашем браузере отключены файлы cookie!
Если браузер отключает файлы cookie, Session может выполнять отслеживание сеанса путем перезаписи URL-адреса.
4.6. Сравнение с междоменным именем
Файлы cookie могут устанавливать атрибут домена для достижения междоменного
Сессия действительна только в пределах текущего доменного имени, и этим доменным именем нельзя похвастаться