1. 程式人生 > >自定義超時驗證器

自定義超時驗證器

日期和時間 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 已過期

技術分享圖片

自定義超時驗證器