应用场景
    用来验证操作是否大于最小时间间隔,如果大于则允许操作,不大于则不允许操作

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;

/**
 * 
描述:验证操作是否大于最小时间间隔(既验证信息是否超时)
* * @author zhangpj 2018年9月5日 */ public class ValidateOvertimeUtil { // 验证一定时间段内是否重复提交 private static Map infoMap = new ConcurrentHashMap(); /** * @功能描述: 验证是否超时
* 统一超时时间使用此方法(所有操作的允许超时时间相同) * * @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; } /** *
功能:验证是否超时
* 非统一超时时间使用此方法 * * @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); } } } } /** *
功能: 清理过期的指定信息
* * @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); } } } } /** *
功能:得到当前日期和时间字符串 格式(yyyy-MM-dd HH:mm:ss)
* * @author zhangpj @date 2018年9月11日 * @return */ private static String getDateTime() { return formatDate(new Date(), "yyyy-MM-dd HH:mm:ss"); } /** *
功能:得到日期字符串 默认格式(yyyy-MM-dd) pattern可以为:"yyyy-MM-dd" "HH:mm:ss"
* * @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; } /** *
功能:获取两个时间相差的秒数
* * @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 未过期

自定义超时验证器_第1张图片

2.2 已过期

自定义超时验证器_第2张图片