Статья, чтобы понять использование и разницу между сеансом и файлом cookie.

Java

1. Что такое сеансы и файлы cookie?

1.1 Концептуальное понимание

Чтобы узнать, что такое сеанс и файлы cookie, вы должны сначала узнать о следующих понятиях.

1.1.1 PAREETS HTTP Protocol

Соглашение: относится к положениям или правилам, которые должны сопровождаться обоими компьютерами в сети компьютерной связи.

Протокол передачи гипертекста (HTTP): это протокол связи, который позволяет документам на языке гипертекстовой разметки (HTML) передаваться в браузер клиента с веб-сервера.

Протокол HTTP является протоколом без сохранения состояния. После завершения обмена данными соединение между клиентом и сервером закрывается, и для повторного обмена данными необходимо установить новое соединение. Это означает, что сервер не может отслеживать сеанс из соединения.

1.1.2 Отслеживание сеанса

Сеанс: Относится к ряду действий после входа пользователя на веб-сайт, таких как просмотр продукта, добавление его в корзину и совершение покупки. Отслеживание сеанса — это метод, обычно используемый в веб-программах для отслеживания всего сеанса пользователя. Обычно используемыми технологиями отслеживания сеансов являются сеансы и файлы cookie. Session определяет личность пользователя, записывая информацию на стороне сервера, а Cookie определяет личность пользователя, записывая информацию на стороне клиента.

1.2 Cookie

Поскольку HTTP является протоколом без сохранения состояния, сервер не может узнать личность клиента только по сетевому соединению. Пользователь А покупает товар и кладет его в корзину.При повторной покупке товара сервер уже не может определить, принадлежит ли покупка сеансу пользователя А или сеансу пользователя Б. Как это сделать? Просто выдайте клиентам пропуск, по одному на каждого человека, и каждый посетитель должен принести свой пропуск. Это позволяет серверу проверять личность клиента по паспорту. Вот как работают файлы cookie.

Файл cookie на самом деле представляет собой небольшой фрагмент текстовой информации. Клиент запрашивает сервер, и если серверу необходимо записать статус пользователя, он использует ответ для выдачи файла cookie браузеру клиента. Клиент сохранит файл cookie.

Когда браузер снова запрашивает веб-сайт, браузер отправляет запрошенный URL-адрес на сервер вместе с файлом cookie. Сервер проверяет файл cookie, чтобы определить статус пользователя. Сервер также может изменить содержимое файла cookie по мере необходимости.

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

Если установлено время истечения, браузер сохраняет файл cookie на жесткий диск. После выключения снова откройте браузер, который остается действительным до тех пор, пока не будет превышено установленное время истечения срока действия. Файлы cookie, хранящиеся на жестком диске, могут совместно использоваться различными процессами браузера. Это называется долгосрочным файлом cookie.

1.2.2 Файлы cookie не являются междоменными

То есть доступ браузера к Baidu не принесет куки Google.

1.3 Session

Сеанс — это еще один механизм записи состояния клиента, разница в том, что файлы cookie хранятся в браузере клиента, а сеансы хранятся на сервере. Когда браузер клиента обращается к серверу, сервер записывает информацию о клиенте на сервере в той или иной форме, которая является сеансом. Когда клиентский браузер снова обращается к нему, ему нужно только посмотреть статус клиента из Session. Каждый пользователь, обращающийся к серверу, устанавливает сеанс и автоматически назначает SessionId для идентификации уникальной личности пользователя.

1.3.1 Два вопроса

1) Как автоматически передавать SessionId на сервер при каждом запросе?

Это cookie, если вы хотите создать сеанс для пользователя, вы можете вернуть уникальное cookie, когда пользователь авторизован. Когда пользователь снова инициирует запрос, браузер автоматически прикрепит сеанс пользователя в информации заголовка HTTP (это автоматическая функция браузера, пользователь не замечает, что разработчик не нуждается в работе), когда сервер Обработав это после запроса, результат возвращается пользователю, соответствующему сеансу.

2) Храните необходимую информацию.

Сервер использует SessionId в качестве ключа для чтения и записи соответствующего значения, что позволяет поддерживать информацию о сеансе.

1.3.2 Создание сеанса

Когда программе необходимо создать сессию для запроса клиента, сервер сначала проверяет, содержит ли запрос клиента уже этот sessionId, если да, то это означает, что сессия для этого клиента была создана ранее, и сервер будет использовать sessionId для сохранения сеанса. Получить его для использования (если он не может быть получен, будет создан новый). Если клиентский запрос не содержит sessionId, для клиента будет создан сеанс, и сеанс, связанный с этим сеансом, будет сгенерировано.

sessionId связан, значение не повторяется ни sessionId, ни легко найти реплику закона строки, sessionId будет возвращен клиенту, хранящемуся в этом ответе.

1.3.3 Отключение файлов cookie

Если клиент отключает файлы cookie, обычно существует два способа реализации сеансов без использования файлов cookie.

1) перезапись URL. Это должно добавить sessionId непосредственно к задней части URL-адреса.

2) Формировать скрытые поля. Сервер автоматически изменит форму, чтобы добавить скрытое поле, чтобы идентификатор сеанса можно было передать обратно на сервер при отправке формы.

Например:

<form name="walking-form" action="/xxx/xxx"> 
    <input type="hidden" name="JSessionId" value="NaOw3vjFW75aKnsF2C2HmdnV9LZcEbzWoWiBdHnLerjQ99zmpQng!-142002807"> 
    <input type="text"> 
</form>

4. Совместное использование сеанса Для одного сервера с несколькими веб-сайтами (один и тот же родительский домен, но разные поддомены) нам нужно решить проблему совместного использования SessionId с разных веб-сайтов. Из-за разных доменных имен (aaa.walking.comиbbb.walking.com), а SessionId хранится в соответствующих файлах cookie, поэтому сервер будет считать, что доступ к двум подстанциям осуществляется из разных сеансов. Решение состоит в том, чтобы достичь цели совместного использования файлов cookie, изменив доменное имя файлов cookie на имя родительского домена, тем самым реализуя совместное использование SessionId (совместное использование сеанса несерверного кластера). Недостаток заключается в том, что информация о файлах cookie одновременно передается между подстанциями.

1.4 Сценарии применения

Войдите на веб-сайт, введите имя пользователя и пароль, чтобы войти сегодня, и во многих случаях откройте его прямо на следующий день. Одним из механизмов, используемых в настоящее время, является файл cookie. Одним из сценариев сеанса является корзина.После добавления продукта клиент может знать, какие продукты были добавлены, и как сервер оценивает это, поэтому необходимо сохранить некоторую информацию и использовать сеанс.

2. Как работать с сессией

В веб-разработке Java Session предоставляет нам много удобства, а Session поддерживается между браузером и сервером. В традиционной веб-разработке на Java мы реализуем взаимодействие протокола Http между клиентом и сервером, реализуя интерфейс javax.servlet.Servlet или наследуя javax.servlet.http.HttpServlet.

2.1 API для управления сеансом

Работа сеанса выглядит следующим образом:

@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
    HttpServletRequest request = (HttpServletRequest) servletRequest;
    HttpSession session = request.getSession();
    
    session.setAttribute("userName","walking");//设置属性
    session.setMaxInactiveInterval(30*60);//过期时间 单位秒
    session.getCreationTime();//获取session的创建时间
    session.getLastAccessedTime();//获取上次与服务器交互时间
    String id = session.getId();//获取sessionId
    int timeout = session.getMaxInactiveInterval();//获取session过期时间
    session.invalidate();//销毁session
}

Клиент и сервер имеют ограничение по времени для поддержания информации о пользователе. Поскольку клиент не взаимодействует с сервером в течение длительного времени (время сна), сеанс считается истек, и сервер разрушает сеанс. Когда клиент Взаимодействует с сервером снова, предыдущий сеанс больше не существует. Это истечение сеанса.

2.2 Установите время истечения сеанса

2.2.1 Установка времени истечения сеанса в традиционных веб-проектах

1. Установите конфигурацию сеанса в web.xml

следующее:

<session-config>
      <session-timeout>2</session-timeout>
</session-config>

То есть максимальный интервал между двумя последовательными взаимодействиями между клиентом и сервером составляет 2 минуты, а значение, полученное с помощью session.getAttribute() через 2 минуты, пусто. Исходная сессия была уничтожена, а ранее установленные значения атрибутов, полученные из новой сессии, естественно пусты.

2, в Tomcat/Conf/web.xml

session-config, значение по умолчанию: 30 минут

<session-config>
     <session-timeout>30</session-timeout>
</session-config>

3. Установите в сервлете

HttpSession session = request.getSession();
session.setMaxInactiveInterval(60);//单位为秒

2.2.2 Установка времени истечения сеанса в проекте SpringBoot

2.3 Описание

1. Приоритет: настройки API в Servlet > Program/web.xml settings > Tomcat/conf/web.xml settings

2. Если сеанс сервера доступа истекает (интервал времени между этим доступом и последним доступом больше, чем максимальный интервал бездействия сеанса), то есть последний сеанс завершается, но сервер и клиент сгенерируют новый session, предыдущий сеанс Все значения атрибутов в нем теряются, и генерируется новый sessionId.

3. Клиент и сервер имеют действующую сессию (сессия не имеет таймаута), и sessionId один и тот же для каждого доступа.Если в коде установлено значение session.setMaxInactiveInterval(), максимальный интервал неактивности этой сессии будет изменено и применено как новое значение.

4. Уничтожение сеанса (обозначает конец цикла сеанса): метод Session.invalidate() вызывается в течение определенного цикла запроса, после окончания цикла запроса сеанс уничтожается или сеанс автоматически уничтожается по истечении тайм-аута; или клиент закрывает браузер

5. Для JSP, если указано <%@ page session="false" %>, встроенная переменная сеанса не может быть напрямую доступна в JSP, и сеанс не будет активно создаваться, поскольку JSP не выполняет автоматически request.getSession в это время () операция для получения сеанса.

3. Обработка файлов cookie

3.1 Работа файлов cookie на стороне сервера

Как упоминалось ранее, каждый раз, когда клиент запрашивает сервер, информация о файлах cookie помещается в информацию заголовка.Мы можем получить все объекты файлов cookie с помощью метода HttpServletRequest.getCookies() и вернуть файлы cookie клиенту с помощью метода addCookie класса HttpServletResponse. объект.

Конкретный API операции выглядит следующим образом:

Cookie[] cookies = request.getCookies();//request对象获取所有cookie
for (Cookie cookie : cookies) {
    String name = cookie.getName();//cookie name
    String value = cookie.getValue();//cookie value
    String domain = cookie.getDomain();//域名
    int maxAge = cookie.getMaxAge();//过期时间
    boolean secure = cookie.getSecure();//浏览器通过安全协议发送cookies 返回true
    String comment = cookie.getComment();//描述
    int version = cookie.getVersion();//版本
    //以上除name属性都有对应set方法

    boolean httpOnly = cookie.isHttpOnly();//是否Httponly
    cookie.setHttpOnly(true);//设置Httponly值
}
//new cookie对象
Cookie cookie = new Cookie("userName","walking");
cookie.setPath("/");
cookie.setMaxAge(60*30);//30分钟
response.addCookie(cookie);//回写给客户端浏览器

3.2 Файлы cookie для работы с интерфейсом

Файл cookie для создания и настройки внешнего интерфейса

/**
 * 创建并设置cookie
 * @param name cookie名称
 * @param value cookie值
 * @param expires 过期时间 毫秒 不填则默认30分
 */
function Setcookie(name, value, expires) {
    //设置名称为name,值为value的Cookie
    expires = expires || 30* 60 * 1000;
    var expdate = new Date();   //初始化时间
    expdate.setTime(expdate.getTime() + expires);   //时间
    //即document.cookie= name+"="+value+";path=/";   时间可以不要,但路径(path)必须要填写,
    // 因为JS的默认路径是当前页,如果不填,此cookie只在当前页面生效!~
    document.cookie = name + "=" + value + ";expires=" + expdate.toGMTString() + ";path=/";
}

Внешний интерфейс получает значение атрибута cookie

/**
 * 获取对应cookie属性的value
 * @param c_name cookie属性name
 * @returns {string} cookie value
 */
function getCookie(c_name) {
    if (document.cookie.length > 0) {
        c_start = document.cookie.indexOf(c_name + "=");
        if (c_start != -1) {
            c_start = c_start + c_name.length + 1;
            c_end = document.cookie.indexOf(";", c_start);
            if (c_end == -1) c_end = document.cookie.length;
            return unescape(document.cookie.substring(c_start, c_end));
        }
    }
    return "";
}

4. Резюме

1. Данные cookie хранятся в браузере клиента, а данные сеанса — на сервере.

2. Файл cookie не очень безопасен. Другие могут проанализировать файл cookie, хранящийся локально, и выполнить обман файлов cookie. Учитывая безопасность, следует использовать сеанс.

3. Сессия будет сохранена на сервере в течение определенного периода времени. Когда количество посещений увеличится, это поднимет производительность вашего сервера.Чтобы снизить производительность сервера, вы должны использовать файлы cookie.

4, Единые хранимые данные файлов cookie не могут превышать 4K, многие браузеры ограничены максимум 20 сайтов, сохраненных файлов cookie.

5. Вы можете рассмотреть возможность хранения важной информации, такой как данные для входа, в виде сеанса, а другую информацию можно сохранить в файле cookie, если вам нужно ее сохранить.

6. В процессе разработки программы мы можем проверять SessionID (значение атрибута в сеансе, другие значения ключа также могут использоваться в среде разработки, отличной от HttpServlet) каждый раз, когда клиент взаимодействует с сервером для управления сеансом.

Оригинальная ссылка