自定义超时验证器

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 已过期

技术分享图片

以上是关于自定义超时验证器的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段——CSS选择器

自定义推文给出“32:无法验证您”。错误。知道为啥吗?

VSCode自定义代码片段6——CSS选择器

VSCode自定义代码片段(vue主模板)

VSCode自定义代码片段——声明函数

VSCode自定义代码片段——.vue文件的模板