Springbootバックエンドはフォームフォームを使用して送信コードの重複を防ぎます

  1. redisCache
  2. key:value;値に
    格納されている要求データの情報(本体と時間)が
    存在する場合は比較され、要求パラメーターと送信時間が比較されます。
    存在しない場合は、リクエスト情報と送信時間をredisCacheに直接入力します
private int intervalTime = 10;

public void setIntervalTime(int intervalTime)
{
    
    
    this.intervalTime = intervalTime;
}
public boolean isRepeatSubmit(HttpServletRequest request)
{
    
    
    // 本次参数及系统时间
    RepeatedlyRequestWrapper repeatedlyRequest = (RepeatedlyRequestWrapper) request;
    String nowParams = HttpHelper.getBodyString(repeatedlyRequest);

    // body参数为空,获取Parameter的数据
    if (StringUtils.isEmpty(nowParams))
    {
    
    
        nowParams = JSONObject.toJSONString(request.getParameterMap());
    }
    Map<String, Object> nowDataMap = new HashMap<String, Object>();
    nowDataMap.put(REPEAT_PARAMS, nowParams);
    nowDataMap.put(REPEAT_TIME, System.currentTimeMillis());

    // 请求地址(作为存放cache的key值)
    String url = request.getRequestURI();

    HttpSession session = request.getSession();
    Object sessionObj = redisCache.getCacheObject(SESSION_REPEAT_KEY);
    if (sessionObj != null)
    {
    
    
        Map<String, Object> sessionMap = (Map<String, Object>) sessionObj;
        if (sessionMap.containsKey(url))
        {
    
    
            Map<String, Object> preDataMap = (Map<String, Object>) sessionMap.get(url);
            if (compareParams(nowDataMap, preDataMap) && compareTime(nowDataMap, preDataMap))
            {
    
    
                return true;
            }
        }
    }
    Map<String, Object> cacheMap = new HashMap<String, Object>();
    cacheMap.put(url, nowDataMap);
    redisCache.setCacheObject(SESSION_REPEAT_KEY, cacheMap, intervalTime, TimeUnit.SECONDS);
    return false;
}

おすすめ

転載: blog.csdn.net/wangleisuiqiansuiyue/article/details/109191737