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

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 res

1,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同步;

cookie和session区别 nginx实现session共享;_第1张图片

你可能感兴趣的:(面试题)