Angular Cookie


83

私はAngularCookieを探し回っていましたが、AngularでCookie管理を実装する方法を見つけることができませんでした。Cookieを管理する方法はありますか(AngularJSの$ cookieなど)?


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
次回は注射可能にする:)
Francis Manoj Fernnado 2016

17
注射可能な機能を備えた独自のソリューションを投稿できるかもしれません。注射可能なソリューションを必要としている他の人にとっては素晴らしいことです:)
Miquel 2016

これはコンポーネントである必要がありますか?注射可能なサービスにしてみませんか?
ベンボゾルグ2016

可能性がありますが、これには同意バナーを表示するためのhtmlとcssもあります。サービスというよりはコンポーネントのようです。サービスを作成することもできますが、より抽象的なサービスにする必要があります:)
Miquel 2016

6
上記の回答に基づいて注射可能なサービスを作成しました:gist.github.com/greatb/c791796c0eba0916e34c536ab65802f8
Bala

43

更新: angular2-cookieは非推奨になりました。代わりに私のngx-cookieを使用してください。

古い答え:

ここでangular2-クッキーアンギュラ1つの正確な実装である$cookiesサービス(プラスremoveAll()私が作成した方法が)。同じメソッドを使用していますが、Angular2ロジックを使用したtypescriptでのみ実装されています。

これをサービスとしてコンポーネントproviders配列に挿入できます。

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

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

その後、通常どおり構成で定義し、使用を開始します。

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

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

あなたはnpm経由でそれを得ることができます:

npm install angular2-cookie --save

1
ng2-cookiesとの違いはどれですか?
ミケル2016年

舞台裏でAngular1のロジックとメソッドを使用しています。したがって、それはより角度のある方法です。また、$ cookiesサービスのすべてのメソッドに加えて、すべて削除メソッドがあります。また、グローバルオプションとパラメータオプションも提供します。そしてそれはサービスです。
s.alem 2016年

ngx-cookieも更新されていないようです。
ジェッペ

ついに更新されました。devが他のもので忙しかったし、彼も少し怠惰です:D
s.alem

11

ええ、ここに1つの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

NGXCookieサービスを使用する

このパッケージをインストールします。 npm install ngx-cookie-service --save

プロバイダーとしてapp.module.tsにCookieサービスを追加します。

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-serviceと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
マヌChadha

5

Miquelsバージョンをサービスとして注入可能にします。

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

クッキーを読むために、私は私のために機能しないミケルバージョンの少しの変更を加えました:

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 "";
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.