ホームページ > バックエンド開発 > PHPチュートリアル > 如何解决Cookie登录 频繁查询数据库问题?

如何解决Cookie登录 频繁查询数据库问题?

WBOY
リリース: 2016-06-06 20:09:31
オリジナル
1302 人が閲覧しました

实现所谓的无状态,使用Cookie认证的话,不用session岂不是每次都要重新认证查一下数据库?
我的具体实现是
定义 一个秘钥 key="随机";
user_profile表 里面放一个字段 token 用户注册的时候,分配一个随机值
用户登录的时候,
String userToken= md5(用户id+token+key);
response.addCookie("user_id",用户id);
response.addCookie("user_token",userToken);

然后定义一个登录拦截器
String userId = request.getCookie("user_id");
String userToken= request.getCookie("user_token");
String token=db.getUserTokenById(userId); //这里每次都要查询一下数据库
String userToken2= md5(用户id+token+key);
if(userToken.equals(userToken2){
//登录成功
} else{
}

这次方式虽然简单,但是还是能够有效防止伪造cookie的
但是这里每次都要查询一下数据库,有没有更好的实现方式

回复内容:

实现所谓的无状态,使用Cookie认证的话,不用session岂不是每次都要重新认证查一下数据库?
我的具体实现是
定义 一个秘钥 key="随机";
user_profile表 里面放一个字段 token 用户注册的时候,分配一个随机值
用户登录的时候,
String userToken= md5(用户id+token+key);
response.addCookie("user_id",用户id);
response.addCookie("user_token",userToken);

然后定义一个登录拦截器
String userId = request.getCookie("user_id");
String userToken= request.getCookie("user_token");
String token=db.getUserTokenById(userId); //这里每次都要查询一下数据库
String userToken2= md5(用户id+token+key);
if(userToken.equals(userToken2){
//登录成功
} else{
}

这次方式虽然简单,但是还是能够有效防止伪造cookie的
但是这里每次都要查询一下数据库,有没有更好的实现方式

既然对于整个事务来说,查询是必须的,那么就应该考虑提高查询效率,根据实际需求像memcache,redis这种键值对形式的数据存储方式就显得很必要了,既能满足数据存储要求,又能缓解性能问题。

不需要每次都查询数据库,token 放入内存做 cache,下次只要查一下 cache,token是否有效,是否过期就行了

token: {
uid: xxx
expired: xxx
}

没感觉到你这个东西比session优化到哪里了。其实简单点儿你可以用你这些数据做AES加密,然后服务器端做反解析就好。
比如:

token = aesHash(uid +'|' + mKey + '+' time)
response.cookie(token, token);

校验时
uid,mKey,time = deAes(token)

同时还可以有ip,ua,操作系统啥的。只要你喜欢。。可以根据自己的情况进行校验,完了之后再去校验用户的身份情况。

少不了数据库查询的。总会有比如用户状态,用户身份,用户权限等等一堆的校验。
不过你这个需求完全可以在redis层面完成,性能+持久化都有。

不要存数据库里面,用memcache或redis,既解决分布式的问题同时性能也很高。

可以考虑NoSQL

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート