热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

cookie和session区别nginx实现session共享;

Flask中cookie和session介绍介绍​在网站中,http请求是无状态的的。也就是说即使第一次和服务器连接上后并且登录成功后,第二次请求服务器

Flask中COOKIE和session介绍
介绍
​ 在网站中,http请求是无状态的的。也就是说即使第一次和服务器连接上后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户。COOKIE的出现就是为了解决这个问题,第一次登录后服务器返回了一些数据(COOKIE)给浏览器,然后浏览器保存在本地,当该用户发送第二次请求时,就会自动的把上次请求存储的COOKIE数据自动的携带给服务器,服务器通过浏览器携带的数据就能判断当前的用户是哪个了。COOKIE存储的数据量有限,不同的浏览器有不同的存储大小,但一般不超过4KB。因此使用COOKIE只能存储一些小量的数据。

​ session和COOKIE的作用有点类似,都是为了存储用户相关的信息。不同的是,COOKIE是存储在本地浏览器,而session存储在服务器。存储在服务器的数据会更加的安全,不容易被窃取。但存储在服务器也有一定的弊端,就是会占用服务器的资源,但现在服务器已经发展至今,一些session信息还是绰绰有余的。

COOKIE和session结合使用
WEB开发至今,COOKIE和session的使用已经出现了一些非常成熟的方案,在如今的市场或企业里,一般有两种存储方式:

存储在服务端:通过COOKIE存储一个session_id,然后具体的数据则是保存在session中,如果用户已经登录,则服务器会在COOKIE中保存一个session_id,下次再次请求的时候,会把该session_id携带上来,服务器根据session_id在session库中获取用户的session数据。就能知道该用户到底是谁,以及之前保存的一些状态信息。这种专业术语叫做server side session。
存储在客户端:将session数据加密,然后存储在COOKIE中。这种专业术语叫做client side session。flask 采用的就是这种方式,但是也可以替换成其他形式。
flask中的session
​ flask中的session机制是:把敏感数据经过加密后放入session中,然后再把session存放到COOKIE中,下次请求的时候,再从浏览器发送过来的COOKIE中读取session,然后再从session中读取敏感数据,并进行解密,获取最终的用户数据。
flask的这种session机制,可以节省服务器的开销,因为把所有的信息都存储到了客户端(浏览器)

二者的出现都是为了解决http请求是无状态的这个问题。
相同点:都是为了存储用户相关的信息
不同点:COOKIE是存储在本地浏览器,而session存储在服务器。
COOKIE存储的数据量有限,不同的浏览器有不同的存储大小,但一般不超过4KB。
因此使用COOKIE只能存储一些小量的数据。存储在服务器的数据会更加的安全,不容易被窃取。
但存储在服务器也有一定的弊端,就是会占用一定的服务器的资源COOKIE的工作流程:
第一次登录后服务器返回了一些数据(COOKIE)给浏览器,然后浏览器保存在本地,
当该用户发送第二次请求时,就会自动的把上次请求存储的COOKIE数据自动的携带给服务器,
服务器通过浏览器携带的数据就能判断当前的用户是哪个了。session的工作流程:
session的底层是基于COOKIE技术来实现的
去访问服务器的时候,服务器会为每个用户的浏览器创建一个会话对象(session对象),
并且为每个session对象创建一个Jsessionid号。当session对象创建成功后,
会以COOKIE的方式将这个Jsessionid号回写给浏览器,
当用户再次进行访问服务器时,及带了具有Jsessionid号的COOKIE数据来一起访问服务器,
服务器通过不同session的 Jsessionid号来找出与其相关联的session对象,通过不同的session对象来为不同的用户服务。flask中默认的session机制
flask中的session机制是:把敏感数据经过加密后放入session中,然后再把session存放到COOKIE中,下次请求的时候,再从浏览器发送过来的COOKIE中读取session,然后再从session中读取敏感数据,并进行解密,获取最终的用户数据。
flask的这种session机制,可以节省服务器的开销,因为把所有的信息都存储到了客户端(浏览器)
可使用官方推荐的flask_session插件,将session存储在redis,memcached,mysql,mongodb等中
需要做一些配置如下:
# flask_session配置
# 上线时,做缓存和存储session可能是用两台机器上的redis,IP地址不一样SESSION_TYPE = 'redis'SESSION_REDIS = redis.StrictRedis(host=REDIS_HOST, port=REDIS_POST)SESSION_USE_SIGNER = True # 对COOKIE中的session_id进行混淆处理PERMANENT_SESSION_LIFETIME = 86400 # 设置session有效期 单位秒django中的session机制
默认是将Session数据存储在数据库中,即:django_session 表中。flask框架:
登陆或者注册时保存用户的登陆状态在session中
session['name'] = user.name
session['mobile'] = user.mobile
session['user_id'] = user.id
# 尝试从session中获取用户的名字
mobile = session.get('mobile')
# 清除session数据
session.clear() django框架
通过HttpRequest对象的session属性进行会话的读写操作。
request.session['键']=
request.session.get('键',默认值)
清除所有session,在存储中删除值部分:request.session.clear()
清除session数据,在存储中删除session的整条数据:request.session.flush()
删除session中的指定键及值,在存储中只删除某个键及对应的值:del request.session['键'](推荐使用)在登陆时判断是否记住用户名和密码
res = redirect(reverse("goods:index"))
redirect返回值是一个HttpResponse响应对象
# 判断是否记住用户名和密码
if remember == "on":res.set_COOKIE("username", username, max_age=7200)res.set_COOKIE("password", password, max_age=7200)
else:res.delete_COOKIE("username")res.delete_COOKIE("password")
return res1,request请求对象,封装了客户端发送的HTTP请求的内容
2,g对象在一次请求中的所有的代码的地方,都是可以使用的设置:g.变量名= 变量值获取:g.name
3,g对象在A路由中设置,只能在A路由请求中获取,其它的请求都不能获取
4,session用户会话,只要设置,在任意请求中都能拿到,无论你拿多少次
5,flash 一旦设置,可在任意一次请求中获取,但是只能取一次

用nginx做负载均衡,这样同一个IP访问同一个页面会被分配到不同的服务器上,要解决session同步的问题
用户在A登陆了,A记住了用户的登录状态,可是下一次用户请求被分配到B去了怎么办?
显然不可能让用户再登陆一次。所以要实现session共享。1:iphash,把特定ip发送给特定主机,就不存在session这个问题了,因为1个用户对应1台主机。但是某时刻当来自某个IP地址的请求特别多,那么将导致某台负载服务器的压力可能非常大,而其他负载服务器却空闲的不均衡情况,这就违背了我们负载均衡的初衷。
2:搭建redis集群或者memcached集群,用集群自带的同步方法来帮我们在不同的主机中同步session,这样就相当于把原来的一份session变成了N分session(有点浪费,哈哈),session的同步就依赖于NoSql集群的同步了。
3:不使用session,换作COOKIE。但是秉承着防御性编程的原则,我们不能相信用户输入,因为COOKIE可能被禁用,甚至篡改。
4:单独设置一个session服务器,负载服务器得到一个sessionid过后,去session服务器获得会话状态,然后根据状态来响应用户请求,如果会话状态为空,则在session服务器中设置一个会话状态,然后返回给用户一个sessionid。引入redis缓存完成session共享(推荐使用)
项目都使用的是同一个地方的redis的缓存,当用户登录的时候,会把session存放在缓存里面,
之后不管访问的是项目的那一台服务器,都会从同一个地方去获取session缓存,这样就很轻松实现了session同步;

在这里插入图片描述


推荐阅读
author-avatar
sysv
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有