您现在的位置是:网站首页> php专栏 常见问题

api接口限制访问

亦然2019-07-25 10:00:44常见问题人已围观

简介在接口开发工作中很常见会用到限时访问功能,目的是用来防止恶意攻击和流量限制。比如每个用户每分钟只允许调用一次接口。或者发表评论中,每个用户五分钟之内只能提交一次评论。本文我们就来实现一个简单的限时访问。

简单介绍两个例子来实现api接口的限制访问功能。

1.限制用户在某一时间段多次访问接口。这里我们只说业务上的简单处理,不涉及限流算法。

  定义一个时间间隔的常量,当用户提交留言时,通过user_id去查询该用户上一条留言时间,把这个时间加上时间间隔,小于当前时间才可以去执行下一步操作。反之需要等待最后时间+间隔秒数-当前时间的秒数值。

//定义时间间隔秒数
$config_time = config('maccms')['comment']['timespan'];
if($param['user_id']){
    $lasttime = Db::connect(config('database1'))
                ->name('comment')
                ->where(['user_id'=>$param['user_id']])
                ->order('comment_time desc')
                ->find();
    //接口延迟秒数
    $second = ($lasttime['comment_time'] + $config_time) - time();
    if((int)($lasttime['comment_time'] + $config_time) > time()){
          return json(['code'=>0,'msg'=>'请在'.$second.'秒后操作']);
    }
 }      

实现效果如下:

2.使用reids实现api接口限制访问
public function test()
    {
        $redis = new \Redis();
        $redis->connect('127.0.0.1', 6379);
        $data=$redis->exists("ad_info");
        // 锁不存在,就执行业务代码
        if (!$data) {
            // 在 Redis 中存一个有效期60秒的缓存锁
            $redis->set('ad_info', "1", 60);
            $data=['code' => 200, 'message' => '可以访问', 'data' => 'somthing'];
            var_dump($data);
        }
        $data=['code' => 422, 'message' => '每分钟只允许调用一次'];
        var_dump($data);
    }

很赞哦!()

亦然

亦然(共32篇文章)

愿你我既可以朝九晚五,也可以浪迹天涯;愿你我既可以拈花把酒,也能围炉诗书茶。