如何基于Cookie实现文章10小时内仅可点赞一次的功能?
核心逻辑梳理
- 点赞记录用JSON格式存储在Cookie中,内容为当前用户已点赞的文章ID数组,可同时记录多篇文章的点赞状态
- 每次收到点赞请求时,先解析Cookie中的点赞数组,校验当前请求的文章ID是否已存在
- 若ID已存在,直接返回重复点赞提示,不做任何操作也不更新Cookie有效期
- 若ID不存在,先更新数据库对应文章的
like字段计数,再将当前文章ID加入点赞数组后重新写入Cookie,有效期设置为10小时
完整代码示例
以下为Laravel框架下的控制器方法实现:
use Illuminate\Http\Request; use Illuminate\Support\Facades\Cookie; public function articleLike(Request $request) { // 从请求参数中获取待点赞的文章ID $articleId = $request->input('article_id'); // 解析Cookie中的点赞记录,无记录则初始化为空数组 $likedArticles = json_decode(Request::cookie('like'), true) ?? []; $validMinutes = 600; // 点赞校验逻辑 if (in_array($articleId, $likedArticles)) { return response()->json([ 'code' => 400, 'message' => '10小时内您已对该文章点过赞,请勿重复操作' ]); } // 执行数据库点赞操作 $article = \App\Models\Article::findOrFail($articleId); $article->increment('like'); // 更新点赞记录并写入Cookie $likedArticles[] = $articleId; $likeCookie = Cookie::make('like', json_encode($likedArticles), $validMinutes); // 响应请求时携带新Cookie return response()->json([ 'code' => 200, 'message' => '点赞成功' ])->withCookie($likeCookie); }
注意事项
- Laravel框架中Cookie必须挂载到响应对象返回才会生效,单独调用Cookie设置方法不会更新用户本地Cookie
- 上述逻辑严格匹配需求:已存在的点赞记录不会触发Cookie有效期更新,只有新点赞操作才会写入带10小时有效期的新Cookie
- 若需防止用户手动篡改Cookie伪造点赞,可对Cookie存储的JSON内容做自定义签名校验,读取时先校验签名合法性再执行业务逻辑
内容的提问来源于stack exchange,提问作者user16993770
相关产品推荐
相关产品推荐

