#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. Да, я виноват. Исправлен текст.