Quantcast
Channel: IT社区推荐资讯 - ITIndex.net
Viewing all articles
Browse latest Browse all 12011

关于如何防止重复签到的技术探讨

$
0
0

    

    问题:

    最近工作中遇到一个签到的问题,其实说来这并不是一个高并发的问题,也并不是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();

 

 

 

 

 



已有 0人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐




Viewing all articles
Browse latest Browse all 12011

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>