В Java, почему файлы cookie добавляются в ответ, а не в запрос?

#java #cookies #request #token #interceptor

Вопрос:

Я заметил, что наш код добавляет маркер доступа / маркер авторизации в ответ в виде файла cookie, используя ((HttpServletResponse) response).addCookie(accessTokenCookie);

Я провел некоторое исследование и обнаружил эту информацию:

Файлы cookie запроса-это файлы cookie, отправляемые из браузера на сервер

Файлы cookie ответа-это файлы cookie, отправляемые (с сервера в браузер).

Если это так, не потребуется ли моему перехватчику запросов / doFilterInternal применить файл cookie маркера доступа к запросу до его прохождения, а не к ответу?

Что еще более запутывает, так это то, что файл cookie маркера доступа создается путем извлечения значения маркера доступа с помощью request.getAttribute. Если запрос уже содержит маркер доступа в качестве атрибута, зачем нужно добавлять файл cookie в ответ?

Ответ №1:

Вы неправильно понимаете, как работают файлы cookie.

Браузер отправляет запрос на какой-то ресурс на каком-то сервере.

Сервер возвращает байты, составляющие ресурс.

Это основной поток. А теперь давайте поговорим о печенье:

Когда сервер возвращает эти байты, он может отправлять заголовки вместе с ними. На самом деле это необходимо; например, чтобы рассказать о том, что представляют данные. Например, если вы запросите /img/background.png , сервер вернет данные изображения, а также отправит Content-Type: image/png . Поскольку браузеры на самом деле не делают всего «расширения указывают, что такое данные», для этого и предназначен заголовок типа содержимого.

Один из этих заголовков- Set-Cookie заголовок.

Установленные заголовки файлов cookie сообщают браузеру: возьмите эти данные и сохраните их где-нибудь. В следующий раз, когда вы загрузите этот ресурс, отправьте его снова. Есть какой-то контроль о том, когда, чтобы отправить его (можно сделать набор-cookie заголовка отправляется, когда сервер reponds для запроса, например /Foo/бар заставить браузер отправить печенье обратно, даже когда просят, например /Foo/баз, или, например, когда foo.myserver.com отправляет файл cookie, он может сказать браузеру: отправки обратно также при запросе ресурсов bar.myserver.com . Однако существуют ограничения; при настройке файла cookie при ответе на запрос вкл myserver.com вы не можете указать браузеру отправить его обратно при отправке на google.com . Браузеры-сложные звери; они поставляются с огромным списком доменов верхнего уровня и не позволят вам этого сделать.

Вы не «добавляете» файлы cookie в «запрос» — материал запроса (данные, которые вы можете получить от HttpServletRequest объекта) просто представляет то, что браузер отправил серверу. Модель запроса/ответа HttpServletRequest состоит строго из двух этапов: браузер отправляет запрос, а сервер отвечает. Это оно. Это не долгий разговор. Всего одно сообщение в каждую сторону, вот и все, что вы получаете.

Итак, вы добавляете файл cookie в «ответ», что означает, что будущие запросы, сделанные тем же браузером, будут затем отправлять его в «запрос».

Комментарии:

1. «Браузер возвращает байты, составляющие ресурс». — вы, конечно, имели в виду «Сервер возвращает байты, составляющие ресурс».

2. Да, я виноват. Исправлен текст.