自定义超时验证器
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自定义超时验证器相关的知识,希望对你有一定的参考价值。
应用场景
用来验证操作是否大于最小时间间隔,如果大于则允许操作,不大于则不允许操作
1. ValidateOvertimeUtil.java
package com.qfx.utils;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.commons.lang3.time.DateFormatUtils;
/**
* <h5>描述:验证操作是否大于最小时间间隔(既验证信息是否超时)</h5>
*
* @author zhangpj 2018年9月5日
*/
public class ValidateOvertimeUtil {
// 验证一定时间段内是否重复提交
private static Map<String,String> infoMap = new ConcurrentHashMap<String, String>();
/**
* @功能描述: 验证是否超时<br/>
* 统一超时时间使用此方法(所有操作的允许超时时间相同)
*
* @param key 标识
* @param intervalTime 最小间隔时间(秒)
* @return 验证通过返回true
*
* @作者:zhangpj @创建时间:2018年4月4日
*/
public static boolean valiOverdtime(String key,int intervalTime){
boolean flag = false;
// 清理过期的所有信息
clearOverdtimeinfo(intervalTime);
if (null == infoMap.get(key)) {
String time = getDateTime();
if (null == time) {
System.out.println(key +" time = "+ time);
}
infoMap.put(key, time);
flag = true;
}
return flag;
}
/**
* <h5>功能:验证是否超时</h5>
* 非统一超时时间使用此方法
*
* @author zhangpj @date 2018年9月5日
* @param key
* @param intervalTime
* @return
*/
public static boolean valiOverdtimeExt(String key,int intervalTime){
boolean flag = false;
// 清理过期的所有信息
clearOverdtimeinfo(key, intervalTime);
if (null == infoMap.get(key)) {
String time = getDateTime();
if (null == time) {
System.out.println(key +" time = "+ time);
}
infoMap.put(key, time);
flag = true;
}
return flag;
}
// ================ private Method ================
/**
* @功能描述: 清理过期的所有信息
*
* @param intervalTime 默认最小间隔时间(秒)
*
* @作者:zhangpj @创建时间:2018年4月4日
*/
private static void clearOverdtimeinfo(int intervalTime){
// 当前时间
String nowTime = DateUtils.getDateTime();
// 同步清理,方式多线程操作时发生异常
synchronized (infoMap) {
for (String key : infoMap.keySet()) {
int second = getDistanceSecond(nowTime, infoMap.get(key));
// 实际间隔时间大于最小间隔时间,则清理
if (second > intervalTime) {
infoMap.remove(key);
}
}
}
}
/**
* <h5>功能: 清理过期的指定信息</h5>
*
* @author zhangpj @date 2018年9月5日
* @param key
* @param intervalTime
*/
private static void clearOverdtimeinfo(String key, int intervalTime){
// 当前时间
String nowTime = DateUtils.getDateTime();
// 同步清理,方式多线程操作时发生异常
synchronized (infoMap) {
// 获取需要比对的信息
String mapValue = infoMap.get(key);
if (null != mapValue) {
int second = getDistanceSecond(nowTime, infoMap.get(key));
// 实际间隔时间大于最小间隔时间,则清理
if (second > intervalTime) {
infoMap.remove(key);
}
}
}
}
/**
* <h5>功能:得到当前日期和时间字符串 格式(yyyy-MM-dd HH:mm:ss)</h5>
*
* @author zhangpj @date 2018年9月11日
* @return
*/
private static String getDateTime() {
return formatDate(new Date(), "yyyy-MM-dd HH:mm:ss");
}
/**
* <h5>功能:得到日期字符串 默认格式(yyyy-MM-dd) pattern可以为:"yyyy-MM-dd" "HH:mm:ss"</h5>
*
* @param date
* @param pattern
* @return
*/
private static String formatDate(Date date, Object... pattern) {
String formatDate = null;
if (pattern != null && pattern.length > 0) {
formatDate = DateFormatUtils.format(date, pattern[0].toString());
} else {
formatDate = DateFormatUtils.format(date, "yyyy-MM-dd");
}
return formatDate;
}
/**
* <h5>功能:获取两个时间相差的秒数</h5>
*
* @param str1 格式:yyyy-MM-dd HH:mm:ss
* @param str2 格式:yyyy-MM-dd HH:mm:ss
* @return
*/
private static int getDistanceSecond(String str1, String str2) {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date one;
Date two;
long diff;
long min = 0;
try {
one = df.parse(str1);
two = df.parse(str2);
long time1 = one.getTime();
long time2 = two.getTime();
diff = time1 - time2;
min = diff / 1000;
} catch (ParseException e) {
e.printStackTrace();
}
return (int) Math.abs(min);
}
public static void main(String[] args) throws InterruptedException {
System.out.println("有效期3秒," + (valiOverdtime("time",3) == true ? "已过期":"未过期"));
Thread.sleep(3000); //延时执行时间(毫秒)
System.out.println("有效期3秒," + (valiOverdtime("time",3) == true ? "已过期":"未过期"));
}
}
2. 效果
2.1 未过期
2.2 已过期
以上是关于自定义超时验证器的主要内容,如果未能解决你的问题,请参考以下文章