码迷,mamicode.com
首页 > 其他好文 > 详细

自定义超时验证器

时间:2018-09-11 18:43:06      阅读:164      评论:0      收藏:0      [点我收藏+]

标签:ons   auth   validate   清理   pre   apach   -o   else   http   

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

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

技术分享图片

自定义超时验证器

标签:ons   auth   validate   清理   pre   apach   -o   else   http   

原文地址:http://blog.51cto.com/1197822/2173935

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!