根据后台返回的时间戳计算距离今天日期生成的日期数组

这段代码定义了一个JavaScript函数,用于计算当前时间与后台给定的起始时间之间的差值,并将其格式化为可显示的日期,以便在下拉列表中显示各个期数。
 getInitDate() {
      const show_start_time = this.wishData.show_start_time; //1702137600 //1702137600是2023-12-12日整
      // 获取今天时间戳,单位是毫秒
      const today = new Date();
      const timestamp = today.getTime();
      // 获得一天时间时分秒
      const dayTime = 24 * 60 * 60;
      // 求差今天的时间戳减去后台返回的时间戳
      let num = parseInt(timestamp / 1000 - show_start_time);
      //数组默认有一个后台返回的时间戳
      let dateArr = [show_start_time];
      //判断差值是否大于一天的时间,如果是就求得中间相差的天数
      if (num > dayTime) {
      	//求得中间相差的天数
        let number = parseInt(num / dayTime);
        for (let i = 0; i < number; i++) {
          let number1 = show_start_time + (i + 1) * dayTime;
          console.log(formatDate2(number1), "ssss");
          dateArr.push(number1);
        }
      }else{
		dateArr = [show_start_time];
	  }
      let arrDate = [];
      //下拉默认选中的期数
      this.award_date = dateArr[dateArr.length-1]
      dateArr.forEach((ele) => {
        let op = {
          value: ele,
          label: formatDate2(ele) + "期",
        };
        arrDate.push(op);
      });
      console.log(arrDate, "arrDate");
      this.dateList = arrDate;
    },
    formatDate2(value) {
	  return formatDateFn(value * 1000, "yyyy-MM-dd");
	},
	formatDateFn(date, fmt) {
	  date = date == undefined ? new Date() : date;
	  date = typeof date == "number" ? new Date(date) : date;
	  fmt = fmt || "yyyy-MM-dd HH:mm:ss";
	  var obj = {
	    y: date.getFullYear(), // 年份,注意必须用getFullYear
	    M: date.getMonth() + 1, // 月份,注意是从0-11
	    d: date.getDate(), // 日期
	    q: Math.floor((date.getMonth() + 3) / 3), // 季度
	    w: date.getDay(), // 星期,注意是0-6
	    H: date.getHours(), // 24小时制
	    h: date.getHours() % 12 == 0 ? 12 : date.getHours() % 12, // 12小时制
	    m: date.getMinutes(), // 分钟
	    s: date.getSeconds(), // 秒
	    S: date.getMilliseconds() // 毫秒
	  };
	  var week = ["天", "一", "二", "三", "四", "五", "六"];
	  for (var i in obj) {
	    fmt = fmt.replace(new RegExp(i + "+", "g"), function(m) {
	      var val = obj[i] + "";
	      if (i == "w") return (m.length > 2 ? "星期" : "周") + week[val];
	      for (var j = 0, len = val.length; j < m.length - len; j++)
	        val = "0" + val;
	      return m.length == 1 ? val : val.substring(val.length - m.length);
	    });
	  }
	  return fmt;
	};
	
<think> 我们需要绘制一个PlantUML流程图,描述Digest认证中防重放的流程。根据要求,流程如下: 1. 客户端发来请求(带Authorization头部) 2. 判断nonce参数是否在全局数组g_digest_nonces中已存在 - 如果存在,则直接返回401 - 如果不存在,则继续认证流程 3. 获取该nonce的过期时间(通过解析nonce中的时间戳,或者有一个关联的存储记录过期时间) 4. 判断是否已过期(当前时间 - nonce的生成时间 > 60秒?) - 如果过期,返回401 - 如果未过期,则进行正常的Digest认证(计算response等) 另外,我们还需要一个后台的定时清理机制:每60秒清理一次过期的nonce(或者每次检查到nonce过期就移除?或者定时清理?)。但是题目要求是:若(now - NonceArray->lastModifyTime) > 60s,则清空整个nonce集合。这里注意,不是清理单个nonce,而是整个集合。所以我们需要记录整个集合的最后修改时间,当超过60秒没有修改时,清空整个集合。 但是,流程图主要是针对请求处理流程,所以后台清理可以单独考虑。在流程图中,我们可以这样处理: 在每次请求到来时,我们先检查全局集合的最后修改时间(lastModifyTime)是否距离现在超过60秒,如果是,则清空集合(避免集合过大)并更新lastModifyTime为当前时间(因为清空操作也是一种修改,所以更新最后修改时间)。 然后,再处理当前请求的nonce。 因此,流程可以调整为: 1. 客户端发来请求(带Authorization头部) 2. 检查全局nonce集合的最后修改时间(lastModifyTime): 如果(当前时间 - lastModifyTime)> 60秒,则清空集合,并设置lastModifyTime为当前时间。 3. 从请求中提取nonce 4. 判断nonce是否在集合中: 存在:返回401(因为nonce重复使用) 不存在: 解析nonce(或者从nonce中提取时间戳,或者我们存储nonce的时候同时存储时间戳?) 注意:题目要求通过nonce+timestamp实现防重放,所以nonce中应该包含时间戳信息。但是,我们存储nonce的集合并不存储时间戳,而是只存储nonce字符串。过期时间是通过nonce本身携带的时间戳来判断的?还是我们另外存储? 根据题目要求,我们存储nonce的集合(g_digest_nonces)只存储nonce字符串,而nonce字符串中包含了时间戳(或者我们生成nonce的时候将时间戳编码进去)。当我们需要判断一个nonce是否过期时,我们可以从nonce中解析出时间戳,然后判断是否超过60秒(从生成到现在)。 因此,在流程图中: 当nonce不在集合中时,我们解析nonce中的时间戳(假设nonce的格式是:时间戳+某种随机数,或者时间戳被编码在nonce中),然后判断当前时间时间戳的差值是否大于60秒。如果大于,则返回401(过期);否则,将nonce加入集合(并更新集合的最后修改时间当前时间?注意:这里加入操作属于修改,所以更新lastModifyTime)然后继续认证流程。 但是,题目要求避免数组过大,采用60秒清空一次整个集合。所以,我们并不需要记录每个nonce的时间戳,而是记录整个集合的最后修改时间(即最后一次添加nonce的时间,或者清空时间)。然后,我们通过全局定时清理(在每次请求到来时检查)来清空集合。 然而,对于单个nonce的过期,我们仍然需要检查(因为nonce本身有过期时间,比如60秒)。所以,这里有两个过期: 1. 全局集合的过期:如果60秒内没有任何请求,那么清空集合(这样新的请求到来时集合是空的,可以重新添加nonce)。 2. 单个nonce的过期:每个nonce生成后60秒就过期,即使集合没有被清空,也要检查。 所以,在流程中: 步骤2:检查全局集合的最后修改时间,如果超过60秒没有修改(即没有添加或清空),则清空集合,并更新最后修改时间当前时间。 步骤4:如果nonce不在集合中,则解析nonce中的时间戳生成时间),判断当前时间生成时间是否超过60秒,如果超过,则返回401(过期),否则将nonce加入集合(此时会更新全局集合的最后修改时间)并继续认证。 因此,流程图如下: 开始 客户端请求(带Authorization头部) -> 解析出nonce 检查全局集合最后修改时间:如果当前时间 - lastModifyTime > 60秒,则清空集合,并设置lastModifyTime为当前时间 检查nonce是否在集合中? 是 -> 返回401(重复使用) 否 -> 从nonce中解析出时间戳生成时间) 如果当前时间 - 生成时间 > 60秒 -> 返回401(过期) 否则 -> 将nonce添加到集合中,并更新lastModifyTime(因为添加操作修改了集合) 进行后续的Digest认证(计算response等) 注意:后续的Digest认证(验证用户名、密码等)在流程图中没有详细展开,因为题目要求主要关注防重放。 我们用PlantUML绘制如下: </think> 以下是Digest认证防重放机制的PlantUML流程图,描述客户端请求处理流程: ```plantuml @startuml skinparam backgroundColor #EEEBDC skinparam handwritten true title Digest认证防重放流程图 start :客户端发送HTTP请求\n(包含Authorization头部); partition 认证服务器 { :解析请求头中的nonce值; if (nonce是否存在于全局数组\ng_digest_nonces中?) then (存在) :返回401 Unauthorized\n(防止重放攻击); stop else (不存在) :从nonce中提取时间戳; :计算当前时间与nonce时间戳差值; if (时间差 > 60秒?) then (是) :**清理机制**\n清空g_digest_nonces数组; :返回401 Unauthorized\n(nonce已过期); stop else (否) :执行标准Digest认证流程; :计算并验证response; if (response验证成功?) then (是) :添加当前nonce到\ng_digest_nonces数组; :更新lastModifyTime为当前时间; :返回200 OK; stop else (否) :返回401 Unauthorized\n(认证失败); stop endif endif endif } @enduml ``` ### 流程图说明: 1. **初始请求**:客户端发送包含Authorization头的请求 2. **Nonce检查**: - 存在 → 立即返回401(防止重放攻击) - 不存在 → 进入时间验证 3. **时间验证**: - 超时(>60s) → 清空nonce集合并返回401 - 未超时 → 进入认证流程 4. **认证流程**: - 成功 → 添加nonce到集合,更新时间戳 - 失败 → 返回401 ### 关键机制: 1. **全局nonce集合**:`g_digest_nonces`存储所有有效nonce 2. **自动清理**:当检测到最近修改时间超过60秒时: ```c if (current_time - lastModifyTime > 60) { memset(g_digest_nonces, 0, sizeof(g_digest_nonces)); lastModifyTime = current_time; } ``` 3. **时间戳嵌入**:nonce格式为`base64(timestamp + ":" + random)` 4. **实时更新**:每次成功认证更新`lastModifyTime`
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值