You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何设置Cookie过期时间以兼容用户时区差异?

解决Cookie过期时间的时区偏差问题

你的问题核心在于依赖expires字段的UTC时间解析,不同时区下客户端对这个时间的解析可能出现偏差。最可靠的解决方案是使用Max-Age替代expires,因为Max-Age是相对当前时间的秒数,完全不涉及时区转换,能精准控制过期时长。

同时你的代码还有两个细节需要修正:

  • clear方法里的expires字段有多余空格,会导致浏览器解析异常
  • 清除Cookie时需要带上和设置时一致的domain参数,否则无法跨子域清除

以下是修正后的完整代码:

export class Auth {
  static config = {
    domain: `${process.env.GRP_APP_HOST?.includes('localhost') ? '.' + process.env.GRP_APP_HOST : ''}`,
  };

  static setToken(token: string) {
    if (token) {
      // 使用Max-Age设置30分钟过期(单位:秒),彻底避免时区问题
      const maxAge = 30 * 60;
      document.cookie = `auth_token=${token}; domain=${this.config.domain}; Max-Age=${maxAge}; path=/`;
      // 可选保留expires作为兼容(但Max-Age优先级更高)
      // const expires = new Date(Date.now() + maxAge * 1000).toUTCString();
      // document.cookie = `auth_token=${token}; domain=${this.config.domain}; Max-Age=${maxAge}; expires=${expires}; path=/`;
    }
  }

  static getToken() {
    return document.cookie
      .split('; ')
      .find(row => row.startsWith('auth_token='))
      ?.split('=')[1];
  }

  static clear() {
    // 带上和设置时一致的domain,去掉expires字段的多余空格
    document.cookie = `auth_token=; domain=${this.config.domain}; Max-Age=0; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/`;
  }
}

关键修改说明:

  1. 用Max-Age替代expires:
    Max-Age=1800表示Cookie从设置时刻起1800秒(30分钟)后过期,完全不依赖客户端时区,是W3C推荐的现代Cookie过期设置方式。

  2. 添加path=/参数:
    确保Cookie在整个域名下有效,默认情况下Cookie只在设置它的路径下生效,添path=/可以避免路径限制问题。

  3. 修复clear方法的Cookie参数:
    清除Cookie必须和设置时的domain、path参数完全一致,否则浏览器会认为是不同的Cookie,无法清除。同时去掉expires字段的多余空格,避免解析错误。

如果一定要兼容老旧浏览器(不支持Max-Age),可以同时保留expires字段,但计算时直接用Date.now()获取UTC时间戳,再转UTC字符串,这样不管时区如何,计算出的过期时间都是准确的:

const expires = new Date(Date.now() + 30 * 60 * 1000).toUTCString();

内容的提问来源于stack exchange,提问作者Norayr Ghukasyan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 17:01:36