2019-08-08 19:01:45 +08:00
/*
2020-04-04 20:30:09 +08:00
* Copyright ( c ) 2016 The ZLMediaKit project authors . All Rights Reserved .
2019-06-12 17:53:48 +08:00
*
2021-01-17 18:31:50 +08:00
* This file is part of ZLMediaKit ( https : //github.com/xia-chu/ZLMediaKit).
2019-06-12 17:53:48 +08:00
*
2020-04-04 20:30:09 +08:00
* Use of this source code is governed by MIT license that can be found in the
* LICENSE file in the root of the source tree . All contributing project authors
* may be found in the AUTHORS file in the root of the source tree .
2019-06-12 17:53:48 +08:00
*/
# ifndef SRC_HTTP_COOKIEMANAGER_H
# define SRC_HTTP_COOKIEMANAGER_H
# include <memory>
# include <unordered_map>
# include "Util/mini.h"
2019-08-20 12:09:43 +08:00
# include "Util/util.h"
2019-06-12 17:53:48 +08:00
# include "Util/TimeTicker.h"
# include "Network/Socket.h"
2019-06-28 16:48:02 +08:00
# include "Common/Parser.h"
2019-06-12 17:53:48 +08:00
# define COOKIE_DEFAULT_LIFE (7 * 24 * 60 * 60)
2019-06-13 12:00:41 +08:00
namespace mediakit {
class HttpCookieManager ;
2019-06-12 17:53:48 +08:00
/**
* cookie对象 , 用 于 保 存 cookie的一些相关属性
*/
2022-02-02 20:34:50 +08:00
class HttpServerCookie : public toolkit : : AnyStorage , public toolkit : : noncopyable {
2019-06-12 17:53:48 +08:00
public :
2019-06-13 12:00:41 +08:00
typedef std : : shared_ptr < HttpServerCookie > Ptr ;
2019-06-12 17:53:48 +08:00
/**
* 构 建 cookie
* @ param manager cookie管理者对象
2019-06-13 12:00:41 +08:00
* @ param cookie_name cookie名 , 例 如 MY_SESSION
2019-06-12 17:53:48 +08:00
* @ param uid 用 户 唯 一 id
2019-06-13 12:00:41 +08:00
* @ param cookie cookie随机字符串
2019-06-12 17:53:48 +08:00
* @ param max_elapsed 最 大 过 期 时 间 , 单 位 秒
*/
2019-06-13 12:00:41 +08:00
HttpServerCookie ( const std : : shared_ptr < HttpCookieManager > & manager ,
2022-02-02 20:34:50 +08:00
const std : : string & cookie_name ,
const std : : string & uid ,
const std : : string & cookie ,
2019-06-13 12:00:41 +08:00
uint64_t max_elapsed ) ;
~ HttpServerCookie ( ) ;
2019-06-12 17:53:48 +08:00
/**
* 获 取 uid
* @ return uid
*/
2022-02-02 20:34:50 +08:00
const std : : string & getUid ( ) const ;
2019-06-12 17:53:48 +08:00
/**
* 获 取 http中Set - Cookie字段的值
* @ param cookie_name 该 cookie的名称 , 譬 如 MY_SESSION
2019-06-13 12:00:41 +08:00
* @ param path http访问路径
2019-06-12 17:53:48 +08:00
* @ return 例 如 MY_SESSION = XXXXXX ; expires = Wed , Jun 12 2019 06 : 30 : 48 GMT ; path = / index / files /
*/
2022-02-02 20:34:50 +08:00
std : : string getCookie ( const std : : string & path ) const ;
2019-06-12 17:53:48 +08:00
/**
* 获 取 cookie随机字符串
* @ return cookie随机字符串
*/
2022-02-02 20:34:50 +08:00
const std : : string & getCookie ( ) const ;
2019-06-12 17:53:48 +08:00
/**
2019-06-13 12:00:41 +08:00
* 获 取 该 cookie名
2019-06-12 17:53:48 +08:00
* @ return
*/
2022-02-02 20:34:50 +08:00
const std : : string & getCookieName ( ) const ;
2019-06-12 17:53:48 +08:00
/**
* 更 新 该 cookie的过期时间 , 可 以 让 此 cookie不失效
*/
void updateTime ( ) ;
/**
* 判 断 该 cookie是否过期
* @ return
*/
bool isExpired ( ) ;
2019-06-14 18:42:09 +08:00
/**
* 获 取 区 域 锁
* @ return
*/
2022-02-02 20:34:50 +08:00
std : : shared_ptr < std : : lock_guard < std : : recursive_mutex > > getLock ( ) ;
2019-06-12 17:53:48 +08:00
private :
2022-02-02 20:34:50 +08:00
std : : string cookieExpireTime ( ) const ;
2019-06-12 17:53:48 +08:00
private :
2022-02-02 20:34:50 +08:00
std : : string _uid ;
std : : string _cookie_name ;
std : : string _cookie_uuid ;
2019-06-12 17:53:48 +08:00
uint64_t _max_elapsed ;
2022-02-02 20:34:50 +08:00
toolkit : : Ticker _ticker ;
std : : recursive_mutex _mtx ;
2019-06-13 12:00:41 +08:00
std : : weak_ptr < HttpCookieManager > _manager ;
2019-06-12 17:53:48 +08:00
} ;
/**
* cookie随机字符串生成器
*/
2019-06-13 12:00:41 +08:00
class RandStrGeneator {
2019-06-12 17:53:48 +08:00
public :
2019-06-13 12:00:41 +08:00
RandStrGeneator ( ) = default ;
~ RandStrGeneator ( ) = default ;
2019-06-12 17:53:48 +08:00
/**
* 获 取 不 碰 撞 的 随 机 字 符 串
* @ return 随 机 字 符 串
*/
2022-02-02 20:34:50 +08:00
std : : string obtain ( ) ;
2019-06-12 17:53:48 +08:00
/**
* 释 放 随 机 字 符 串
* @ param str 随 机 字 符 串
*/
2022-02-02 20:34:50 +08:00
void release ( const std : : string & str ) ;
2019-06-12 17:53:48 +08:00
private :
2022-02-02 20:34:50 +08:00
std : : string obtain_l ( ) ;
2019-06-12 17:53:48 +08:00
private :
//碰撞库
2022-02-02 20:34:50 +08:00
std : : unordered_set < std : : string > _obtained ;
2019-06-12 17:53:48 +08:00
//增长index, 防止碰撞用
int _index = 0 ;
} ;
/**
* cookie管理器 , 用 于 管 理 cookie的生成以及过期管理 , 同 时 实 现 了 同 账 号 异 地 挤 占 登 录 功 能
* 该 对 象 实 现 了 同 账 号 最 多 登 录 若 干 个 设 备
*/
2019-06-13 12:00:41 +08:00
class HttpCookieManager : public std : : enable_shared_from_this < HttpCookieManager > {
2019-06-12 17:53:48 +08:00
public :
2019-06-13 12:00:41 +08:00
typedef std : : shared_ptr < HttpCookieManager > Ptr ;
friend class HttpServerCookie ;
~ HttpCookieManager ( ) ;
2019-06-12 17:53:48 +08:00
/**
* 获 取 单 例
*/
2019-06-13 12:00:41 +08:00
static HttpCookieManager & Instance ( ) ;
2019-06-12 17:53:48 +08:00
/**
* 添 加 cookie
2019-06-13 12:00:41 +08:00
* @ param cookie_name cookie名 , 例 如 MY_SESSION
2019-06-12 17:53:48 +08:00
* @ param uid 用 户 id , 如 果 为 空 则 为 匿 名 登 录
* @ param max_client 该 账 号 最 多 登 录 多 少 个 设 备
* @ param max_elapsed 该 cookie过期时间 , 单 位 秒
* @ return cookie对象
*/
2022-02-02 20:34:50 +08:00
HttpServerCookie : : Ptr addCookie ( const std : : string & cookie_name , const std : : string & uid , uint64_t max_elapsed = COOKIE_DEFAULT_LIFE , int max_client = 1 ) ;
2019-06-12 17:53:48 +08:00
/**
* 根 据 cookie随机字符串查找cookie对象
2019-06-13 12:00:41 +08:00
* @ param cookie_name cookie名 , 例 如 MY_SESSION
2019-06-12 17:53:48 +08:00
* @ param cookie cookie随机字符串
* @ return cookie对象 , 可 以 为 nullptr
*/
2022-02-02 20:34:50 +08:00
HttpServerCookie : : Ptr getCookie ( const std : : string & cookie_name , const std : : string & cookie ) ;
2019-06-12 17:53:48 +08:00
/**
* 从 http头中获取cookie对象
2019-06-13 12:00:41 +08:00
* @ param cookie_name cookie名 , 例 如 MY_SESSION
2019-06-12 17:53:48 +08:00
* @ param http_header http头
* @ return cookie对象
*/
2022-02-02 20:34:50 +08:00
HttpServerCookie : : Ptr getCookie ( const std : : string & cookie_name , const StrCaseMap & http_header ) ;
2019-06-12 17:53:48 +08:00
2019-06-14 15:19:02 +08:00
/**
* 根 据 uid获取cookie
* @ param cookie_name cookie名 , 例 如 MY_SESSION
* @ param uid 用 户 id
* @ return cookie对象
*/
2022-02-02 20:34:50 +08:00
HttpServerCookie : : Ptr getCookieByUid ( const std : : string & cookie_name , const std : : string & uid ) ;
2019-06-14 15:19:02 +08:00
2019-06-12 17:53:48 +08:00
/**
* 删 除 cookie , 用 户 登 出 时 使 用
* @ param cookie cookie对象 , 可 以 为 nullptr
* @ return
*/
2019-06-13 12:00:41 +08:00
bool delCookie ( const HttpServerCookie : : Ptr & cookie ) ;
2019-06-12 17:53:48 +08:00
private :
2019-06-13 12:00:41 +08:00
HttpCookieManager ( ) ;
2019-06-12 17:53:48 +08:00
void onManager ( ) ;
/**
* 构 造 cookie对象时触发 , 目 的 是 记 录 某 账 号 下 多 个 cookie
2019-06-13 12:00:41 +08:00
* @ param cookie_name cookie名 , 例 如 MY_SESSION
2019-06-12 17:53:48 +08:00
* @ param uid 用 户 id
* @ param cookie cookie随机字符串
*/
2022-02-02 20:34:50 +08:00
void onAddCookie ( const std : : string & cookie_name , const std : : string & uid , const std : : string & cookie ) ;
2019-06-12 17:53:48 +08:00
/**
* 析 构 cookie对象时触发
2019-06-13 12:00:41 +08:00
* @ param cookie_name cookie名 , 例 如 MY_SESSION
2019-06-12 17:53:48 +08:00
* @ param uid 用 户 id
* @ param cookie cookie随机字符串
*/
2022-02-02 20:34:50 +08:00
void onDelCookie ( const std : : string & cookie_name , const std : : string & uid , const std : : string & cookie ) ;
2019-06-12 17:53:48 +08:00
2019-06-14 15:19:02 +08:00
/**
* 获 取 某 用 户 名 下 最 先 登 录 时 的 cookie , 目 的 是 实 现 某 用 户 下 最 多 登 录 若 干 个 设 备
* @ param cookie_name cookie名 , 例 如 MY_SESSION
* @ param uid 用 户 id
* @ param max_client 最 多 登 录 的 设 备 个 数
* @ return 最 早 的 cookie随机字符串
*/
2022-02-02 20:34:50 +08:00
std : : string getOldestCookie ( const std : : string & cookie_name , const std : : string & uid , int max_client = 1 ) ;
2019-06-14 15:19:02 +08:00
2019-06-12 17:53:48 +08:00
/**
* 删 除 cookie
2019-06-13 12:00:41 +08:00
* @ param cookie_name cookie名 , 例 如 MY_SESSION
2019-06-12 17:53:48 +08:00
* @ param cookie cookie随机字符串
* @ return 成 功 true
*/
2022-02-02 20:34:50 +08:00
bool delCookie ( const std : : string & cookie_name , const std : : string & cookie ) ;
2019-06-12 17:53:48 +08:00
private :
2022-02-02 20:34:50 +08:00
std : : unordered_map < std : : string /*cookie_name*/ , std : : unordered_map < std : : string /*cookie*/ , HttpServerCookie : : Ptr /*cookie_data*/ > > _map_cookie ;
std : : unordered_map < std : : string /*cookie_name*/ , std : : unordered_map < std : : string /*uid*/ , std : : map < uint64_t /*cookie time stamp*/ , std : : string /*cookie*/ > > > _map_uid_to_cookie ;
std : : recursive_mutex _mtx_cookie ;
toolkit : : Timer : : Ptr _timer ;
2019-06-13 12:00:41 +08:00
RandStrGeneator _geneator ;
2019-06-12 17:53:48 +08:00
} ;
2019-06-13 12:00:41 +08:00
} //namespace mediakit
2019-06-12 17:53:48 +08:00
# endif //SRC_HTTP_COOKIEMANAGER_H