自定義超時驗證器
阿新 • • 發佈:2018-09-11
日期和時間 inter EDA cto time() term move 比對 指定
應用場景
用來驗證操作是否大於最小時間間隔,如果大於則允許操作,不大於則不允許操作
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 已過期
自定義超時驗證器