Winkelkekse

81

Ich habe mich überall nach Angular-Cookies umgesehen, aber ich konnte nicht herausfinden, wie die Cookie-Verwaltung in Angular implementiert werden kann. Gibt es eine Möglichkeit, Cookies zu verwalten (wie $ cookie in AngularJS)?

Miquel
quelle
7
Angular2 hat keine native Bibliothek / keinen nativen Dienst, um Cookies zu verarbeiten. Der bevorzugte Weg ist die Verwendung von JWT / LocalStorage. github.com/auth0/angular2-authentication-sample
stan

Antworten:

76

Ich habe meine eigenen Funktionen erstellt:

@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();
        }
    }
}
Miquel
quelle
5
mach es das nächste Mal injizierbar :)
Francis Manoj Fernnado
17
Vielleicht könnten Sie Ihre eigene Lösung mit injizierbarer Funktionalität veröffentlichen, das wäre großartig für andere, die es injizierbar benötigen :)
Miquel
Muss dies eine Komponente sein? Warum machst du es nicht zu einem injizierbaren Service?
Ben Bozorg
Könnte sein, aber dies hat auch HTML und CSS, um Zustimmungsbanner zu zeigen. Es scheint eher eine Komponente als ein Service zu sein. Sie könnten auch einen Dienst machen, sollten aber abstrakter sein :)
Miquel
6
Ich habe den injizierbaren Dienst basierend auf der obigen Antwort erstellt: gist.github.com/greatb/c791796c0eba0916e34c536ab65802f8
Bala
43

Update: angle2-cookie ist jetzt veraltet. Bitte verwenden Sie stattdessen mein ngx-Cookie .

Alte Antwort:

Hier ist angular2-cookie , die genaue Implementierung des von mir erstellten Angular 1- $cookiesDienstes (plus einer removeAll()Methode). Es werden dieselben Methoden verwendet, die nur in Typoskript mit Angular 2-Logik implementiert sind.

Sie können es als Service in das Komponentenarray providerseinfügen:

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

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

Definieren Sie es danach wie gewohnt in der Struktur und beginnen Sie mit der Verwendung von:

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

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

Sie können es über npm erhalten:

npm install angular2-cookie --save
an alem
quelle
1
Was ist der Unterschied zu ng2-Cookies?
Miquel
Es verwendet die Winkel-1-Logik und Methoden hinter den Kulissen. So ist es eckiger. Außerdem enthält es alle Methoden des $ cookies-Dienstes sowie eine Methode zum Entfernen aller. Außerdem bietet es globale und Parameteroptionen. Und es ist ein Service.
am
ngx-cookie scheint auch nicht mehr aktualisiert zu werden.
Jeppe
Es wurde endlich aktualisiert. Der Entwickler war mit anderen Sachen beschäftigt und er ist auch ein bisschen faul: D
s.alem
11

Ja, hier ist ein ng2-Cookie

Verwendung:

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');
Arturs Soms
quelle
1
Ihre API hat sich hier geändert, sind die Dokumente: github.com/BCJTI/ng2-cookies/wiki/Minimum-running-example
etayluz
8

Verwenden Sie den NGX-Cookie-Service

Inastall dieses Paket: npm install ngx-cookie-service --save

Fügen Sie den Cookie-Service als Anbieter zu Ihrer app.module.ts hinzu:

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

Rufen Sie dann Ihre Komponente auf:

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
}

Das ist es!

Deepak Swain
quelle
Hallo Deepak, hast du bisher mit diesem Service gearbeitet? Weil ich eine Frage habe und hoffe, dass Sie mir helfen können.
Herr Jo
Ich habe sowohl den ngx-Service als auch die Cookie-Zustimmung installiert. Ich habe jetzt große Probleme damit, es auf Opt-In-Weise zu implementieren. Ich habe versucht, alle Cookies zu löschen, wenn der Benutzer die Schaltfläche "Cookies ablehnen" drückt, diese jedoch irgendwie zurückgesetzt werden. Wissen Sie also, wie dies richtig gemacht werden sollte?
Herr Jo
Dies ist meine Frage dazu: stackoverflow.com/questions/61656421/…
Herr Jo
Es scheint, dass die Version 10.1.1Fehler verursacht Uncaught TypeError: Object(...) is not a function. Ich benutze die Version 2.1.0, um den Code zum Laufen zu bringen. Überprüfen Sie github.com/stevermeister/ngx-cookie-service/issues/103
Manu Chadha
5

Ich mache Miquels Version als Service injizierbar:

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();
        }
    }

}
Mailand
quelle
Wie setze ich HttpOnly und sichere Flags?
Iniravpatel
2

Es ist auch vorteilhaft, Daten in zu speichern 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();

Weitere Informationen finden Sie unter https://developer.mozilla.org/en-US/docs/Web/API/Window/sessionStorage

WasiF
quelle
0

Zum Lesen eines Cookies habe ich kleine Änderungen an der Miquel-Version vorgenommen, die für mich nicht funktionieren:

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 "";
Pelice
quelle