Кутове куки


83

Я довкола шукав кутові файли Angular, але не зміг знайти, як реалізувати управління файлами cookie в Angular. Чи є спосіб керувати файлами cookie (наприклад, $ cookie в AngularJS)?


7
Angular2 не має власної бібліотеки / служби для обробки файлів cookie. Кращим способом є використання JWT / LocalStorage. github.com/auth0/angular2-authentication-sample
stan

Відповіді:


77

Я закінчив створювати власні функції:

@Component({
    selector: 'cookie-consent',
    template: cookieconsent_html,
    styles: [cookieconsent_css]
})
export class CookieConsent {
    private isConsented: boolean = false;

    constructor() {
        this.isConsented = this.getCookie(COOKIE_CONSENT) === '1';
    }

    private getCookie(name: string) {
        let ca: Array<string> = document.cookie.split(';');
        let caLen: number = ca.length;
        let cookieName = `${name}=`;
        let c: string;

        for (let i: number = 0; i < caLen; i += 1) {
            c = ca[i].replace(/^\s+/g, '');
            if (c.indexOf(cookieName) == 0) {
                return c.substring(cookieName.length, c.length);
            }
        }
        return '';
    }

    private deleteCookie(name) {
        this.setCookie(name, '', -1);
    }

    private setCookie(name: string, value: string, expireDays: number, path: string = '') {
        let d:Date = new Date();
        d.setTime(d.getTime() + expireDays * 24 * 60 * 60 * 1000);
        let expires:string = `expires=${d.toUTCString()}`;
        let cpath:string = path ? `; path=${path}` : '';
        document.cookie = `${name}=${value}; ${expires}${cpath}`;
    }

    private consent(isConsent: boolean, e: any) {
        if (!isConsent) {
            return this.isConsented;
        } else if (isConsent) {
            this.setCookie(COOKIE_CONSENT, '1', COOKIE_CONSENT_EXPIRE_DAYS);
            this.isConsented = true;
            e.preventDefault();
        }
    }
}

5
зробіть це ін’єкційним наступним разом :)
Френсіс Маной Фернадо

17
Можливо, ви могли б опублікувати своє власне рішення з ін’єкційною функціональністю, що було б чудово для інших, хто потребує його ін’єкційного введення :)
Miquel

Це повинен бути компонент? Чому б вам не зробити це ін'єкційною послугою?
Бен Бозорг,

Може бути, але тут також є html і css, щоб показати банер згоди. Це більше схоже на компонент, ніж на послугу. Ви також можете зробити послугу, але вона повинна бути більш абстрактною :)
Мікель

6
Я створив ін’єкційну службу на основі наведеної вище відповіді: gist.github.com/greatb/c791796c0eba0916e34c536ab65802f8
Бала,

43

Оновлення: angular2-cookie тепер застаріло. Будь ласка, використовуйте мій файл cookie ngx .

Стара відповідь:

Ось angular2-cookie, який є точною реалізацією служби Angular 1 $cookies(плюс removeAll()метод), який я створив. Він використовує ті самі методи, лише реалізовані в машинописі з логікою Angular 2.

Ви можете ввести його як службу в providersмасив компонентів :

import {CookieService} from 'angular2-cookie/core';

@Component({
    selector: 'my-very-cool-app',
    template: '<h1>My Angular2 App with Cookies</h1>',
    providers: [CookieService]
})

Після цього, визначте його в consturctur, як зазвичай, і починайте використовувати:

export class AppComponent { 
  constructor(private _cookieService:CookieService){}

  getCookie(key: string){
    return this._cookieService.get(key);
  }
}

Ви можете отримати його через npm:

npm install angular2-cookie --save

1
У чому різниця з ng2-cookie?
Мікель

Він використовує кутову логіку 1 та закулісні методи. Так це в більш кутовий спосіб. Також у ньому є всі методи служби $ cookies, плюс метод видалення всіх. Також він надає глобальні параметри та параметри. І це послуга.
s.alem

Здається, ngx-cookie більше не оновлюється.
Джеппе

Це нарешті оновлено. Розробник був зайнятий іншими речами, і він теж трохи лінивий: D
s.alem

11

Так, ось один ng2-cookie

Використання:

import { Cookie } from 'ng2-cookies/ng2-cookies';

Cookie.setCookie('cookieName', 'cookieValue');
Cookie.setCookie('cookieName', 'cookieValue', 10 /*days from now*/);
Cookie.setCookie('cookieName', 'cookieValue', 10, '/myapp/', 'mydomain.com');

let myCookie = Cookie.getCookie('cookieName');

Cookie.deleteCookie('cookieName');

1
Їх API змінився ось документи: github.com/BCJTI/ng2-cookies/wiki/Minimum-running-example
etayluz

8

Використовуйте службу cookie NGX

Видаліть цей пакет: npm install ngx-cookie-service --save

Додайте послугу cookie до свого app.module.ts як постачальника:

import { CookieService } from 'ngx-cookie-service';
@NgModule({
  declarations: [ AppComponent ],
  imports: [ BrowserModule, ... ],
  providers: [ CookieService ],
  bootstrap: [ AppComponent ]
})

Потім зателефонуйте своєму компоненту:

import { CookieService } from 'ngx-cookie-service';

constructor( private cookieService: CookieService ) { }

ngOnInit(): void {
  this.cookieService.set( 'name', 'Test Cookie' ); // To Set Cookie
  this.cookieValue = this.cookieService.get('name'); // To Get Cookie
}

Це воно!


Привіт Діпак, чи працював ти досі з цією службою? Тому що я маю запитання і сподіваюся, що ви можете мені допомогти.
Містер Джо

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

Це моє запитання щодо цього: stackoverflow.com/questions/61656421/…
Містер Джо,

Здається, версія 10.1.1створює помилку Uncaught TypeError: Object(...) is not a function. Я використовую версію, 2.1.0щоб змусити код працювати. Перевірити github.com/stevermeister/ngx-cookie-service/issues/103
Ману Чадха

5

Я роблю версію Miquels Injectable як послугу:

import { Injectable } from '@angular/core';

@Injectable()
export class CookiesService {

    isConsented = false;

    constructor() {}

    /**
     * delete cookie
     * @param name
     */
    public deleteCookie(name) {
        this.setCookie(name, '', -1);
    }

    /**
     * get cookie
     * @param {string} name
     * @returns {string}
     */
    public getCookie(name: string) {
        const ca: Array<string> = decodeURIComponent(document.cookie).split(';');
        const caLen: number = ca.length;
        const cookieName = `${name}=`;
        let c: string;

        for (let i  = 0; i < caLen; i += 1) {
            c = ca[i].replace(/^\s+/g, '');
            if (c.indexOf(cookieName) === 0) {
                return c.substring(cookieName.length, c.length);
            }
        }
        return '';
    }

    /**
     * set cookie
     * @param {string} name
     * @param {string} value
     * @param {number} expireDays
     * @param {string} path
     */
    public setCookie(name: string, value: string, expireDays: number, path: string = '') {
        const d: Date = new Date();
        d.setTime(d.getTime() + expireDays * 24 * 60 * 60 * 1000);
        const expires = `expires=${d.toUTCString()}`;
        const cpath = path ? `; path=${path}` : '';
        document.cookie = `${name}=${value}; ${expires}${cpath}; SameSite=Lax`;
    }

    /**
     * consent
     * @param {boolean} isConsent
     * @param e
     * @param {string} COOKIE
     * @param {string} EXPIRE_DAYS
     * @returns {boolean}
     */
    public consent(isConsent: boolean, e: any, COOKIE: string, EXPIRE_DAYS: number) {
        if (!isConsent) {
            return this.isConsented;
        } else if (isConsent) {
            this.setCookie(COOKIE, '1', EXPIRE_DAYS);
            this.isConsented = true;
            e.preventDefault();
        }
    }

}

Як встановити HttpOnly та захистити прапори?
iniravpatel

2

Також корисно зберігати дані в sessionStorage

// Save data to sessionStorage
sessionStorage.setItem('key', 'value');

// Get saved data from sessionStorage
var data = sessionStorage.getItem('key');

// Remove saved data from sessionStorage
sessionStorage.removeItem('key');

// Remove all saved data from sessionStorage
sessionStorage.clear();

для деталей https://developer.mozilla.org/en-US/docs/Web/API/Window/sessionStorage


0

Для прочитання файлу cookie я зробив невеликі модифікації версії Miquel, яка для мене не працює:

getCookie(name: string) {
        let ca: Array<string> = document.cookie.split(';');
        let cookieName = name + "=";
        let c: string;

        for (let i: number = 0; i < ca.length; i += 1) {
            if (ca[i].indexOf(name, 0) > -1) {
                c = ca[i].substring(cookieName.length +1, ca[i].length);
                console.log("valore cookie: " + c);
                return c;
            }
        }
        return "";
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.