Heim >Backend-Entwicklung >PHP-Tutorial >如何解决Cookie登录 频繁查询数据库问题?

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

WBOY
WBOYOriginal
2016-06-06 20:09:311297Durchsuche

实现所谓的无状态,使用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

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn