關於如何防止重複簽到的技術探討

labreeze發表於2016-04-13

    

    問題:

    最近工作中遇到一個簽到的問題,其實說來這並不是一個高併發的問題,也並不是CSRF偽造請求的問題,但是跟這兩點有點類似,總結來說是針對使用者防止短時間內重複刷請求的問題啦,根本原因其實是單使用者的併發問題,那麼如何實現呢?

 

   解答: 

   思路一,CSRF問題我們怎麼解決呢,一般是用時間戳,Appkey,AppSecret來生成token,過了預定的時間這個請求就不能用了。如果這種策略用在解決這個問題上肯定是行不通的,因為一般的時間戳過期時間肯定是以分鐘為單位的,而簽到一般是秒級單位的,一秒內可以生成多次簽到請求。

 

   思路二,搞一個ConcurrentHashMap,來控制使用者的訪問。但是有多個節點啊,記憶體的同步首先就是個問題,。

   

 Object signObj = concurrentHashMap.get("username");
 if(null == signObj) {
     signObj = concurrentHashMap.putIfAbsent("username", new Object());
         if(null != signObj) {
             doSign();
             concurrentHashMap.remove("username");
         }
 }

 

   思路三,目前的實現是Cache來實現的,思路其實差不多,可能cache會快一點點和設定超時時間吧。

   

//防止重複處理, 如果有資料返回false
//即使失敗了,一分鐘內也不能再重試請求了
boolean succ = setCacheDataIfNotExist(accountId + 
                      "-" + sourceType, accountId + "|" + sourceType, 60 * 1000);
if(!succ){
   LogConstant.runLog.info("User sign repeatly! accountId : " + accountId + " ip : " + ip + " sourceType: " + sourceType);
   return -1;
}
dosign();

 

 

 

 

 

相關文章