Как установить дату истечения срока действия cookie в AngularJS
Мы хотим сохранить информацию об авторизации пользователя в cookie, которая не должна быть потеряна при обновлении (F5) браузера.
Мы хотим сохранить информацию об авторизации в файле "постоянного cookie", если пользователь во время входа в систему установил флажок "Запомнить меня".
8 ответов
Это возможно в сборке 1.4.0 angular с использованием ngCookies
модуль:
https://docs.angularjs.org/api/ngCookies/service/$cookies
angular.module('cookiesExample', ['ngCookies'])
.controller('ExampleController', ['$cookies', function($cookies) {
// Find tomorrow's date.
var expireDate = new Date();
expireDate.setDate(expireDate.getDate() + 1);
// Setting a cookie
$cookies.put('myFavorite', 'oatmeal', {'expires': expireDate});
}]);
Для версии 1.4: Как отмечено в комментарии здесь и других ниже, начиная с версии 1.4, встроенная поддержка файлов cookie Angular теперь позволяет редактировать файлы cookie:
Благодаря 38fbe3ee, $cookies больше не будут предоставлять свойства, которые представляют текущие значения cookie браузера. $cookies больше не опрашивает браузер на предмет изменений в файлах cookie и больше не копирует значения cookie в объект $ cookies.
Это было изменено, потому что опрос дорогой и вызвал проблемы с некорректной синхронизацией свойств $ cookies с фактическими значениями cookie браузера (причина, по которой опрос был первоначально добавлен, состоял в том, чтобы разрешить связь между различными вкладками, но сегодня есть лучшие способы сделать это, например localStorage.)
Новый API для $ cookies выглядит следующим образом:
get put getObject putObject getAll remove Вы должны использовать методы, описанные выше, для доступа к данным cookie. Это также означает, что вы больше не можете просматривать свойства в $ cookies, чтобы обнаружить изменения, которые происходят в cookie-файлах браузера.
Эта функция обычно требуется только в том случае, если сторонняя библиотека программным образом изменяла файлы cookie во время выполнения. Если вы полагаетесь на это, то вы должны либо написать код, который может реагировать на стороннюю библиотеку, вносящую изменения в файлы cookie, либо внедрить собственный механизм опроса.
Фактическая реализация выполняется через объект $ cookiesProvider, который можно передать через put
вызов.
Для версии 1.3 и ниже: для тех из вас, кто сделал все возможное, чтобы избежать необходимости загружать плагины jQuery, это, кажется, хорошая замена для угловых - https://github.com/ivpusic/angular-cookie
В Angular v1.4 вы, наконец, можете установить некоторые параметры для файлов cookie, например, срок действия. Вот очень простой пример:
var now = new Date(),
// this will set the expiration to 12 months
exp = new Date(now.getFullYear()+1, now.getMonth(), now.getDate());
$cookies.put('someToken','blabla',{
expires: exp
});
var cookie = $cookies.get('someToken');
console.log(cookie); // logs 'blabla'
Если вы проверите свои куки после запуска этого кода, вы увидите, что срок действия будет правильно установлен на куки с именем someToken
,
Объект передан в качестве третьего параметра put
Вышеприведенная функция позволяет использовать и другие параметры, такие как настройка path
, domain
а также secure
, Проверьте документы для обзора.
PS - Как примечание, если вы обновляете $cookieStore
устарела, так $cookies
в настоящее время единственный способ борьбы с файлами cookie. см документы
Я хотел бы представить дополнительный пример, так как некоторые люди знают дополнительную продолжительность жизни куки. то есть. Они хотят, чтобы куки продолжались еще 10 минут или еще 1 день.
Обычно вы уже знаете, как долго будет длиться cookie в секундах.
var today = new Date();
var expiresValue = new Date(today);
//Set 'expires' option in 1 minute
expiresValue.setMinutes(today.getMinutes() + 1);
//Set 'expires' option in 2 hours
expiresValue.setMinutes(today.getMinutes() + 120);
//Set 'expires' option in (60 x 60) seconds = 1 hour
expiresValue.setSeconds(today.getSeconds() + 3600);
//Set 'expires' option in (12 x 60 x 60) = 43200 seconds = 12 hours
expiresValue.setSeconds(today.getSeconds() + 43200);
$cookies.putObject('myCookiesName', 'myCookiesValue', {'expires' : expiresValue});
и вы можете получить его как обычно:
var myCookiesValue = $cookies.getObject('myCookiesName');
Если пусто, возвращается неопределенное.
Ссылки;
http://www.w3schools.com/jsref/jsref_obj_date.asp
https://docs.angularjs.org/api/ngCookies/provider/$ cookiesProvider # defaults
Вы можете перейти к сценарию angular.js и изменить cookie для вставки.
ищи self.cookies = function(name, value) {
тогда вы можете изменить код, который добавляет куки, например, в течение 7 дней
if (value === undefined) {
rawDocument.cookie = escape(name) + "=;path=" + cookiePath +
";expires=Thu, 01 Jan 1970 00:00:00 GMT";
} else {
if (isString(value)) {
var now = new Date();
var time = now.getTime();
time += 24*60*60*1000*7;
now.setTime(time);
cookieLength = (rawDocument.cookie = escape(name) + '=' + escape(value) +
';path=' + cookiePath+";expires="+now.toGMTString()).length + 1
Я знаю, что этот вопрос немного устарел, и уже получил приемлемый ответ.
Но все еще существующая проблема, с которой я борюсь (не касаясь jQuery или чистого Javascript).
Итак, после некоторых исследований я нашел это: https://github.com/ivpusic/angular-cookie
Что обеспечивает "интерфейс", очень похожий на $cookieStore. И позволяет настроить срок годности (стоимость и единицы).
Что касается собственной поддержки angular на дату истечения срока действия с $ cookie или $cookieStore, "они" обещают обновления по этому вопросу на 1.4, посмотрите на это: https://github.com/angular/angular.js/pull/10530
Можно будет установить срок действия с помощью $cookieStore.put(...), по крайней мере, они предлагают, чтобы...
РЕДАКТИРОВАТЬ: Я столкнулся с "проблемой", вы не можете смешать $ cookie с модульной Angular-cookie. Так что если вы установите cookie сipCookie(...)
получить его с ipCookie(...)
потому что с $ cookie он вернется undefined
,
Как отметил@vincent-briglia, есть jQuery-выпадающий список, который можно использовать в качестве обходного пути до $cookie
сервис становится настраиваемым - проверьте это здесь
Вы можете использовать https://github.com/ivpusic/angular-cookie
Сначала вам нужно ввести ipCookie в ваш угловой модуль.
var myApp = angular.module('myApp', ['ipCookie']);
А теперь, например, если вы хотите использовать его с вашего контроллера
myApp.controller('cookieController', ['$scope', 'ipCookie', function($scope, ipCookie) {
// your code here
}]);
Для создания куки используйте
ipCookie(key, value);
Значение поддерживает строки, числа, логические значения, массивы и объекты и будет автоматически сериализовано в файл cookie.
Вы также можете установить некоторые дополнительные параметры, такие как количество дней, когда истекает срок действия куки
ipCookie(key, value, { expires: 21 });