java 时间戳验证_时间戳校验问题

博客围绕Java时间戳展开,介绍了设置地址访问失效时间的方法,即生成地址时加入时间戳,访问时与系统当前时间比较。还分享了时间格式使用错误导致验证超时的问题,以及正确的时间格式。此外,给出了时间戳转换成时间的实例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有一些需求需要设置某地址的访问失效时间,例如生成地址之后30分钟之内可以访问,30分钟之后就不允许访问。此时需要在生成地址时加入当前时间戳,在用户访问该地址时获取地址中的时间戳和系统当前的时间做比较,即可得出是否允许访问的权限。

例如:地址生成时加入时间戳字段time=20191127121314,用户访问时获取到time字段的值,得到毫秒值,再加上30分钟对应的毫秒值即:30*60*1000=1800000,得到该地址可以访问的最大时间的毫秒值timeMax,然后再获取系统当前的毫秒值timeNow和timeMax进行比较,若timeMax

错误代码:

1 String time = "20191127121314";2 SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmss");3 long millionSeconds = sdf.parse(time).getTime();//毫秒

4 long timeMax= millionSeconds + 1800000;5 long timeNow = newDate().getTime();6 if(timeMax< timeNow){

System.out.println("timeMax======"+timeMax+";timeNow======="+timeNow+";校验失败,超时!");7 }

以上代码用了几天没有什么问题,但是偶尔有一次在中午12点多的时候生成地址去访问发现超时了,看了系统时间和地址中的时间戳都没有问题。自己在本地验证了一下,20191127121314 对应的毫秒值是--1574784794000,而系统的当前毫秒值是:1574830678691,这两个毫秒值之间相差了12个多小时,最后发现是时间格式的原因,yyyyMMddhhmmss中应该是HH,hh-12小时制(1-12),HH-24小时制(0-23),修改之后验证没有问题。

正确代码:

1 String time = "20191127121314";2 SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");3 long millionSeconds = sdf.parse(time).getTime();//毫秒

4 long timeMax= millionSeconds + 1800000;5 long timeNow = newDate().getTime();6 if(timeMax

(转)Java 实例 - 时间戳转换成时间

以下实例演示了如何使用 SimpleDateFormat 类的 format() 方法将时间戳转换成时间。

日期和时间模式(注意大小写,代表的含义是不同的):

yyyy:年

MM:月

dd:日

hh:1~12小时制(1-12)

HH:24小时制(0-23)

mm:分

ss:秒

S:毫秒

E:星期几

D:一年中的第几天

F:一月中的第几个星期(会把这个月总共过的天数除以7)

w:一年中的第几个星期

W:一月中的第几星期(会根据实际情况来算)

a:上下午标识

k:和HH差不多,表示一天24小时制(1-24)

K:和hh差不多,表示一天12小时制(0-11)

z:表示时区

Main.java 文件

1 importjava.text.SimpleDateFormat;2 importjava.util.Date;3

4 public classMain{5 public static voidmain(String[] args){6 Long timeStamp = System.currentTimeMillis(); //获取当前时间戳

7 SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");8 String sd = sdf.format(new Date(Long.parseLong(String.valueOf(timeStamp)))); //时间戳转换成时间

9 System.out.println("格式化结果:" +sd);10

11 SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy 年 MM 月 dd 日 HH 时 mm 分 ss 秒");12 String sd2 = sdf2.format(newDate(Long.parseLong(String.valueOf(timeStamp))));13 System.out.println("格式化结果:" +sd2);14 }15 }

以上代码运行输出结果为:

格式化结果:2018-07-1012:17:34格式化结果:2018年07月10日12时17分34秒

参考文档:https://www.runoob.com/java/date-timestamp2date.html

### 带有时间戳Java接口设计与实现 在Java中实现带有时间戳的接口可以通过多种方式完成,具体取决于应用场景以及安全性需求。以下是基于提供的引用内容和专业知识的一种设计方案。 #### 时间戳的设计原则 为了确保接口的安全性和可靠性,在设计带时间戳的接口时需考虑以下几点: - **防止重放攻击**:通过验证时间戳的有效期来避免恶意用户重复发送旧请求[^3]。 - **数据一致性**:利用原子操作类(如`AtomicStampedReference`)管理对象状态变化及其对应的时间戳[^2]。 - **序列化支持**:如果涉及网络传输,则需要确保时间戳能够被正确编码并解码[^1]。 #### 接口定义示例 下面是一个简单的RESTful风格API接口定义,其中包含了时间戳参数: ```java public class TimestampedRequest { private String action; // 请求动作 private long timestamp; // 客户端生成的时间戳 private String sign; // 数字签名用于校验请求合法性 public TimestampedRequest(String action, long timestamp, String sign) { this.action = action; this.timestamp = timestamp; this.sign = sign; } // Getter and Setter methods... } ``` #### 后端处理逻辑 服务器接收到上述请求后,应执行如下步骤以确认其有效性: 1. 验证时间戳是否处于合理范围内; 2. 使用预共享密钥或其他机制重新计算签名并与传入值对比; 3. 如果一切正常继续业务流程;否则返回错误信息给调用方。 ```java import java.time.Instant; public boolean validateTimestamp(long clientTimestamp){ Instant now = Instant.now(); long currentEpochSecond = now.getEpochSecond(); final int MAX_TIME_DIFF_SECONDS = 60 * 5; // Allowable difference of five minutes. if(Math.abs(currentEpochSecond - clientTimestamp) > MAX_TIME_DIFF_SECONDS ){ System.out.println("Invalid request due to expired or future timestamp."); return false; } return true; } // Example usage within controller method: if(!validateTimestamp(request.getTimestamp())){ throw new SecurityException("The provided timestamp is invalid!"); } else{ processBusinessLogic(); } ``` #### 数据同步与线程安全 当多个线程可能同时修改某个资源的状态时,可以采用`AtomicStampedReference`来减少竞态条件的风险。例如银行账户余额更新场景下可这样写: ```java AtomicStampedReference<Integer> moneyRef = new AtomicStampedReference<>(initialBalance, initialStamp); int[] stampHolder = {0}; while(true){ Integer m = moneyRef.getReference(); int s = moneyRef.getStamp(); if(moneyRef.compareAndSet(m, m-10, s, s+1)){ break; }else{ Thread.sleep(1); // Wait briefly before retrying. } } System.out.println("Transaction succeeded with updated balance "+moneyRef.getReference()); ``` 以上代码片段展示了如何在一个事务性的环境中运用时间标记保护共享变量免受并发访问带来的问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值