关于django使用session和cookies验证登录状态的问题
前段时间,我在b站看了关于django的教学视频,视频里老师验证登录状态是利用session和cookies实现的,也就是说登录状态的保存通过session和cookies保存,代码如下:```python
def check_login(fn):
def warp(request, *args, **kwargs):
if 'username' not in request.session or 'id' not in request.session:
c_username = request.COOKIES.get('username')
c_id = request.COOKIES.get('id')
if not c_username or not c_id:
return HttpResponseRedirect('/user/login')
else:
request.session['username'] = c_username
request.session['id'] = c_id
return fn(request, *args, **kwargs)
return warp
```
他是通过装饰器封装验证登录状态的函数
但是这里我就有点疑问了,代码里,他首先查看的是session是否有登录的状态,当session没有后,再查看cookies中是否有登录状态,那么,为什么不能直接就只用cookies来验证登录状态,而是要同时使用两个?有点小懵
这个代码写法很有问题。。。至少应该是检查 cookie与session保持一致才算登陆态验证成功{:1_911:} fanai 发表于 2021-8-19 10:49
这个代码写法很有问题。。。至少应该是检查 cookie与session保持一致才算登陆态验证成功
那session过期了,cookies没过期,那不是没法验证是否保持一致 session是存在服务器上的。cookies 是存在用户浏览器里的。
这种是最简单的效验。应该就是老师作为例子。
一般情况是直接使用JWT来做效验 1.session储存在服务端,比cookie安全,如果存储在session端的数据校验不通过那就没必要再去校验cookie了;
2.session默认缓存在内存中,读取更快;
3.用户可编辑和伪造cookie,如果cookie的设置机制过于简单,则可伪造cookie,这时再没有session校验,即可轻松骗过服务端 anandyuan 发表于 2021-8-19 12:13
1.session储存在服务端,比cookie安全,如果存储在session端的数据校验不通过那就没必要再去校验cookie了; ...
按照您的说法,是只要session不要cookies也行吗,那么按照正常的验证登录的写法和方式应该是怎么样的呢 super谦 发表于 2021-8-19 14:01
按照您的说法,是只要session不要cookies也行吗,那么按照正常的验证登录的写法和方式应该是怎么样的呢
1.session有效期短,超过一段时间不访问就会被释放掉;2.当存在多台服务器(多节点部署)时,再次请求可能会被分配到另一台服务器,如果session没持久化存储可能这台服务器就不能分辨你是哪个用户,3.访问用户过多时会占用服务器资源,考虑到减轻服务器性能方面,应当使用cookie,
其实完全可以只使用cookie或session,仅使用session或cookie达到的效果可能没那么好,二者结合起来可能达到意想不到的效果。
初学时老师可能只是为了让同学们弄懂理解即可,也许当你学的差不多时再回过来看这些问题就会又明白很多。 super谦 发表于 2021-8-19 11:41
那session过期了,cookies没过期,那不是没法验证是否保持一致
session过期了就重新登陆或刷新
页:
[1]