haizlin / fe-interview

前端面试每日 3+1,以面试题来驱动学习,提倡每日学习与思考,每天进步一点!每天早上5点纯手工发布面试题(死磕自己,愉悦大家),6000+道前端面试题全面覆盖,HTML/CSS/JavaScript/Vue/React/Nodejs/TypeScript/ECMAScritpt/Webpack/Jquery/小程序/软技能……
http://www.h-camel.com
MIT License
25.04k stars 3.24k forks source link

[angular] 第1871天 请说说在Angular中怎样设置、获取和清除cookie? #5833

Open haizhilin2013 opened 1 month ago

haizhilin2013 commented 1 month ago

第1871天 请说说在Angular中怎样设置、获取和清除cookie?

3+1官网

我也要出题

llccing commented 5 days ago

在Angular中,处理cookies可以通过多种方式完成,其中包括使用原生的JavaScript方法和第三方库。下面详细介绍如何在Angular中设置、获取和清除cookie:

使用JavaScript处理Cookies

设置Cookie

要在Angular中设置cookie,可以直接使用document.cookie属性。以下是一个设置cookie的示例:

setCookie(name: string, value: string, days: number) {
  const date = new Date();
  date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
  const expires = "expires=" + date.toUTCString();
  document.cookie = name + "=" + value + ";" + expires + ";path=/";
}

获取Cookie

要获取cookie,可以解析document.cookie属性。以下是一个获取cookie的示例:

getCookie(name: string): string | null {
  const nameEQ = name + "=";
  const ca = document.cookie.split(';');
  for (let i = 0; i < ca.length; i++) {
    let c = ca[i];
    while (c.charAt(0) == ' ') c = c.substring(1, c.length);
    if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
  }
  return null;
}

清除Cookie

要清除cookie,可以设置一个过期的日期。以下是一个清除cookie的示例:

deleteCookie(name: string) {
  document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;';
}

使用第三方库处理Cookies

在Angular项目中,使用第三方库如ngx-cookie-service可以更方便地管理cookies。

安装ngx-cookie-service

首先,安装ngx-cookie-service库:

npm install ngx-cookie-service

设置Cookie

在Angular组件或服务中使用CookieService来设置cookie:

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

constructor(private cookieService: CookieService) { }

setCookie() {
  this.cookieService.set('test', 'Hello World', 1); // 1 表示1天
}

获取Cookie

使用CookieService来获取cookie:

getCookie() {
  const cookieValue = this.cookieService.get('test');
  console.log(cookieValue);
}

清除Cookie

使用CookieService来清除cookie:

deleteCookie() {
  this.cookieService.delete('test');
}

示例代码整合

下面是一个完整的Angular服务示例,展示如何使用ngx-cookie-service来设置、获取和清除cookie:

import { Injectable } from '@angular/core';
import { CookieService } from 'ngx-cookie-service';

@Injectable({
  providedIn: 'root'
})
export class CookieManagerService {

  constructor(private cookieService: CookieService) { }

  setCookie(name: string, value: string, days: number) {
    this.cookieService.set(name, value, days);
  }

  getCookie(name: string): string {
    return this.cookieService.get(name);
  }

  deleteCookie(name: string) {
    this.cookieService.delete(name);
  }
}

在组件中使用这个服务:

import { Component, OnInit } from '@angular/core';
import { CookieManagerService } from './cookie-manager.service';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {

  constructor(private cookieManager: CookieManagerService) { }

  ngOnInit() {
    this.cookieManager.setCookie('username', 'John Doe', 7);
    console.log(this.cookieManager.getCookie('username'));
    this.cookieManager.deleteCookie('username');
  }
}

以上内容展示了如何在Angular中使用原生JavaScript方法和ngx-cookie-service库来设置、获取和清除cookie。根据项目需求,可以选择适合的方法进行实现。

llccing commented 5 days ago

追问:前端设置的cookie 和 server端设置的区别是什么,最佳实践是怎么样的


在Web开发中,cookie的设置可以在前端(客户端)和后端(服务器端)进行。两者有各自的优势和应用场景。下面详细说明它们的区别以及最佳实践。

前端设置的Cookie

优点

  1. 即时性
    • 前端可以立即设置和获取cookie,适用于需要即时响应的场景,如用户设置或临时存储。
  2. 简单易用
    • 使用JavaScript或相关库即可操作,简单方便。

缺点

  1. 安全性
    • 前端设置的cookie容易被用户或恶意脚本篡改,不适合存储敏感信息。
  2. 受限于浏览器
    • 一些浏览器策略或插件可能会限制cookie的使用。

适用场景

服务器端设置的Cookie

优点

  1. 安全性
    • 服务器端设置的cookie可以设置为HttpOnly,防止JavaScript访问,增加安全性。
  2. 控制性
    • 服务器可以根据具体逻辑和需求动态设置和管理cookie,避免前端篡改。

缺点

  1. 延迟
    • 需要经过网络传输,可能存在一定的延迟。
  2. 依赖后端逻辑
    • 需要后端代码来生成和管理cookie,增加了一定的开发复杂度。

适用场景

最佳实践

安全性

  1. 使用HttpOnlySecure属性

    • 设置cookie时,尽量使用HttpOnlySecure属性。HttpOnly防止JavaScript访问,Secure确保cookie只通过HTTPS传输。
      Set-Cookie: name=value; HttpOnly; Secure
  2. 设置合适的SameSite属性

    • 使用SameSite属性来防止CSRF攻击。
      Set-Cookie: name=value; SameSite=Strict

生命周期管理

  1. 设置合适的过期时间

    • 根据业务需求设置合适的过期时间,避免长期存储敏感信息。
      Set-Cookie: name=value; Expires=Wed, 21 Oct 2025 07:28:00 GMT
  2. 定期清理和更新cookie

    • 定期清理不再需要的cookie,防止数据过期或冗余。

数据最小化

  1. 只存储必要的信息
    • 避免在cookie中存储大量数据,只存储必要的信息。
  2. 加密敏感信息
    • 对存储在cookie中的敏感信息进行加密,增加安全性。

服务器端示例(使用Node.js和Express)

const express = require('express');
const app = express();

// 设置cookie
app.get('/set-cookie', (req, res) => {
  res.cookie('token', 'your_secure_token', { httpOnly: true, secure: true, sameSite: 'Strict' });
  res.send('Cookie is set');
});

// 获取cookie
app.get('/get-cookie', (req, res) => {
  let token = req.cookies['token'];
  res.send(`Token is: ${token}`);
});

// 清除cookie
app.get('/clear-cookie', (req, res) => {
  res.clearCookie('token');
  res.send('Cookie is cleared');
});

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

前端示例(使用JavaScript)

// 设置cookie
function setCookie(name, value, days) {
  const date = new Date();
  date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
  const expires = "expires=" + date.toUTCString();
  document.cookie = name + "=" + value + ";" + expires + ";path=/";
}

// 获取cookie
function getCookie(name) {
  const nameEQ = name + "=";
  const ca = document.cookie.split(';');
  for (let i = 0; i < ca.length; i++) {
    let c = ca[i];
    while (c.charAt(0) == ' ') c = c.substring(1, c.length);
    if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
  }
  return null;
}

// 清除cookie
function deleteCookie(name) {
  document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;';
}

总结