각도 쿠키


83

나는 Angular 쿠키를 둘러 보았지만 Angular에서 쿠키 관리를 구현하는 방법을 찾을 수 없었습니다. 쿠키를 관리하는 방법이 있습니까 (예 : AngularJS의 $ 쿠키 )?


7
Angular2에는 쿠키를 처리 할 네이티브 라이브러리 / 서비스가 없습니다. 선호하는 방법은 JWT / LocalStorage를 사용하는 것입니다. github.com/auth0/angular2-authentication-sample
stan 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
그것을 주사 다음 시간 : 확인
프랜시스 마노 Fernnado

17
어쩌면 당신은 주 기능을 자신의 솔루션을 게시 할 수있는, 즉 그것을 주 : 필요로하는 다른 사람을 위해 좋은 것
미켈

구성 요소 여야합니까? 주사 가능한 서비스로 만들지 그래?
Ben Bozorg

그럴 수 있지만 동의 배너를 표시하는 html 및 css도 있습니다. 서비스 라기보다는 구성 요소처럼 보입니다. 서비스도 만들 수 있지만 좀 더 추상적 인 것이어야합니다. :)
Miquel

6
위의 답변을 기반으로 주입 가능한 서비스를 만들었습니다. gist.github.com/greatb/c791796c0eba0916e34c536ab65802f8
Bala

43

업데이트 : angular2-cookie 는 이제 더 이상 사용되지 않습니다. 대신 내 ngx-cookie를 사용하십시오.

이전 답변 :

다음은 Angular 1 서비스 의 정확한 구현 인 angular2-cookie 입니다 $cookies.removeAll() 내가 만든 메서드) . 동일한 메서드를 사용하고 있으며 Angular 2 논리를 사용하는 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의 차이점은 무엇입니까?
Miquel

그것은 뒤에서 각도 1 논리와 방법을 사용하고 있습니다. 그래서 그것은 더 각진 방식입니다. 또한 $ cookies 서비스의 모든 메소드와 모든 제거 메소드가 있습니다. 또한 글로벌 및 매개 변수 옵션을 제공합니다. 그리고 그것은 서비스입니다.
s.alem

ngx-cookie도 더 이상 업데이트되지 않는 것 같습니다.
Jeppe

마침내 업데이트되었습니다. dev에 다른 물건 바쁜 그는 조금 게으른 비트도 : D
s.alem을

11

예, 여기에 ng2- 쿠키 하나가 있습니다.

용법:

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

사용 NGX 쿠키 서비스

이 패키지를 Inastall : npm install ngx-cookie-service --save

쿠키 서비스를 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
}

그게 다야!


안녕 디팍, 지금까지이 서비스를 사용 하셨나요? 질문이 있고 당신이 저를 도울 수 있기를 바랍니다.
Mr. Jo

ngx-service와 쿠키 동의를 모두 설치했습니다. 저는 이제 옵트 인 방식으로 구현하는 데 어려움을 겪고 있습니다. 사용자가 쿠키 거부 버튼을 누르면 모든 쿠키를 삭제하려고했지만 어떻게 든 재설정되고 있습니다. 그렇다면 이것이 올바른 방법으로 수행되어야하는 방법을 알고 있습니까?
Mr. Jo

이것은 이것에 대한 나의 질문입니다 : stackoverflow.com/questions/61656421/…
Mr. Jo

버전에서 10.1.1오류가 발생 하는 것 같습니다 Uncaught TypeError: Object(...) is not a function. 2.1.0코드를 작동시키기 위해 버전 을 사용 합니다. github.com/stevermeister/ngx-cookie-service/issues/103
Manu Chadha

5

나는 Miquels Version 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

쿠키를 읽으려면 작동하지 않는 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 "";
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.