Як встановити термін дії файлу cookie в AngularJS


81
  1. Ми хочемо зберігати інформацію про авторизацію користувача у файлі cookie, який не слід втрачати під час оновлення (F5) браузера.

  2. Ми хочемо зберігати інформацію про авторизацію у "постійному файлі cookie", якщо користувач вибрав прапорець "Запам'ятати мене" під час входу.


2
В даний час я використовую локальне сховище і зберігання сеансу для цієї мети Ref people.opera.com/shwetankd/external/demos/webstorage_demo.htm
Ананд

Відповіді:


46

Це можливо у побудові 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});
}]);

2
з документації не дуже зрозуміло, {'expires': expireDate});чи ... ............ [{'expires': expireDate}]);слід використовувати формат ...
Серж

2
Документація $ cookies.put (ключ, значення, [параметри]) [] є анотацією для "необов'язково". Це не означає масив !!! Насправді вони сказали, що "варіанти" - це один об'єкт {a: x, b: y, c: z}, якщо ви знову прочитаєте документацію.
Дженна Лист

32

Для 1.4: Як зазначено в коментарі тут та інших нижче, станом на 1.4, підтримка власних файлів cookie Angular тепер надає можливість редагування файлів cookie:

Через 38fbe3ee файли cookie $ більше не матимуть властивостей, що представляють поточні значення файлів cookie браузера. Файли cookie більше не опитують браузер щодо змін файлів cookie і більше не копіюють значення файлів cookie на об’єкт $ cookies.

Це було змінено, оскільки опитування є дорогим і спричиняє проблеми з властивостями $ cookies, які неправильно синхронізуються з фактичними значеннями файлів cookie браузера (Причиною того, що опитування було спочатку додано, було забезпечення зв'язку між різними вкладками, але сьогодні є кращі способи зробити це , наприклад localStorage.)

Новий API для $ cookie такий:

get put getObject putObject getAll remove Ви повинні чітко використовувати наведені вище методи, щоб отримати доступ до даних cookie. Це також означає, що ви більше не можете переглядати властивості файлів cookie $, щоб виявити зміни, що відбуваються на файлах cookie браузера.

Ця функція, як правило, потрібна лише в тому випадку, якщо стороння бібліотека програмно змінювала файли cookie під час виконання. Якщо ви покладаєтесь на це, то ви повинні написати код, який може реагувати на сторонні бібліотеки, що вносять зміни до файлів cookie, або реалізувати власний механізм опитування.

Фактична реалізація здійснюється через об'єкт $ cookiesProvider , який можна передавати через putвиклик.

Для версії 1.3 і нижче: Для тих з вас, хто доклав усіх зусиль, щоб уникнути необхідності завантажувати плагіни jQuery, це видається гарною заміною angular - https://github.com/ivpusic/angular-cookie


Чудове рішення при використанні Angular 1.3 або нижче.
vegemite4me

27

У 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'

Якщо ви перевірите свої файли cookie після запуску цього коду, ви побачите, що термін дії буде належним чином встановлений для названого файлу cookie someToken.

Об'єкт , переданий в якості третіх парів до putфункції вище , дозволяє для інших варіантів , а також, такі як налаштування path, domainі secure. Перегляньте документи для огляду.

PS - Як допоміжне зауваження, якщо ви оновлюєте розум, який $cookieStoreвже не підтримується, $cookiesце тепер єдиний спосіб мати справу з файлами cookie. див. документи


15

Я хотів би навести додатковий приклад, оскільки деяким людям відома тривалість життя файлів cookie. тобто Вони хочуть встановити, щоб 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 # за замовчуванням


1
Звідки береться today?
Thomas Kekeisen,

Я спробував зробити код приємнішим і забув змінити всі "зараз" на сьогодні. Тепер має бути добре.
Andreas Panagiotidis

Я маю питання. Коли я отримую значення від файлу cookie, чи слід перевіряти термін його дії або $cookiesавтоматично повертається невизначеним, якщо термін дії минув?
hadi.mansouri

3

Ви можете перейти до сценарію angular.js і змінити
пошук файлу cookie для вставки, self.cookies = function(name, value) { тоді ви можете змінити код, який додає файл cookie, наприклад, протягом 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

2

Я знаю, що це питання трохи давнє, і вже маю прийняту відповідь.

Але все ще актуальна проблема, з якою я борюся (не щодо jQuery чи чистого Javascript).

Отже, після деяких досліджень я знайшов це: https://github.com/ivpusic/angular-cookie

Що забезпечує "інтерфейс", схожий на $ cookieStore. І дозволяє встановлювати термін придатності (значення та одиниці виміру).

Щодо рідної підтримки на кутовий термін дії із $ cookie або $ cookieStore, "вони" обіцяють оновлення з цього питання 1.4, розгляньте це: https://github.com/angular/angular.js/pull/10530

Можна встановити термін дії за допомогою $ cookieStore.put (...), принаймні вони пропонують, щоб ...

РЕДАГУВАТИ: Я зіткнувся з "проблемою", ви не можете змішувати кукі $ з модульними кутовими куками. Отже, якщо ви встановите файл cookie з ipCookie(...)отриманням його за допомогою, ipCookie(...)оскільки з $ cookie він повернеться undefined.



0

Ви можете використовувати https://github.com/ivpusic/angular-cookie

Спочатку потрібно ввести ipCookie у ваш кутовий модуль.

var myApp = angular.module('myApp', ['ipCookie']);

А тепер, наприклад, якщо ви хочете використовувати його від свого контролера

myApp.controller('cookieController', ['$scope', 'ipCookie', function($scope, ipCookie) {
  // your code here
}]);

Для створення файлу cookie використовуйте

ipCookie(key, value);

Значення підтримує рядки, числа, логічні значення, масиви та об'єкти і буде автоматично серіалізовано в файлі cookie.

Ви також можете встановити деякі додаткові параметри, наприклад кількість днів, коли термін дії файлу cookie закінчується

ipCookie(key, value, { expires: 21 });
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.