【会话】
定义:从打开浏览器访问一个网站,到关闭浏览器结束此次访问,称之为一次会话。
*HTTP协议是无状态的,导致会话状态难以保持。
Cookies和Session就是为了保持会话状态而诞生的两个存储技术。
【Cookies】
cookies是保存在客户端浏览器上的存储空间。
*查看方式:
Chrome:开发者工具->Application->Storage->Cookies
火狐:开发者工具->存储->Cookie查看
【Cookies的特点】
- cookies在浏览器上是以键值对的形式进行存储的,键和值都是以ASCII字符串的形式存储的(不能是中文字符串)
- 存储的数据带有生命周期
- cookies中的数据是按域存储隔离的,不同的域之间无法访问
- cookies的内部数据在每次访问此网址时都会被携带到服务器端,如果cookies过大,则会降低响应速度
【Cookies存储】
HttpResponse.set_cookie(key, value='', max_age=None, expires=None)
参数解释:
- key:cookie的名字
- value:cookie的值
- max_age:cookie的存活时间,单位为秒(s)
- expires:cookie的具体过期时间
***当不指定max_age和expires时,关闭浏览器时此数据失效
样例:
添加cookie
# 为浏览器添加键为my_var1,值为123,过期时间为1个小时的cookie
responds = HttpResponse("已添加my_var1, 值为123")
responds.set_cookie('my_var1', 123, 3600)
return responds
修改cookie
# 为浏览器添加键为my_var1,修改值为456,过期时间为2个小时的cookie
responds = HttpResponse("已修改my_var1, 值为456")
responds.set_cookie('my_var1', 456, 3600*2)
return responds
【Cookies删除】
# 删除指定的key的cookie(若key不存在则无事发生)
HttpResponse.delete_cookie(key)
【Cookies获取】
# 通过request.COOKIES绑定的字典(dict)获取客户端的COOKIES数据
value = request.COOKIES.get('cookies名', '默认值')
样例:
# 获取浏览器中my_var变量对应的值
value = request.COOKIES.get('my_var', '没有值!')
print("cookie my_var = ", value)
return HttpResponse("my_var: " + value)
【session】
定义:session是在服务器上开辟一段空间用于保留浏览器和服务器交互时的重要数据。
实现方式:
- 使用session需要在浏览器客户端启动cookie,且在cookie中存储sessionid
- 每个客户端都可以在服务器端有一个独立的session
- 注意:不同发请求者之间不会共享这个数据,是与请求者一一对应的
【session初始配置】
在settings.py中配置session
1、向INSTALLED_APPS列表中添加:
INSTALLED_APPS = [
# 启用sessions应用
'django.contrib.sessions',
]
2、向MIDDLEWARE列表中添加:
MIDDLEWARE = [
#
'django.contrib.sessions.middleware.SessionMiddleware',
]
【session的使用】
*session是一个类似字典的SessionStore类型的对象,,可以用类似于字典的方式进行操作。
session能够存储如字符串、整型、字典、列表等。
- 保存session的值到服务器:request.session['KEY'] = VALUE
- 获取session的值:
- value = request.session['KEY']
- value = request.session.get('KEY', 默认值)
- 删除session:del request.session['KEY']
【session相关配置项】
settings.py中相关配置项
- SESSION_COOKIE_AGE
- 作用:指定sessionid在cookies中的保存时长(默认为2周)
- 举例:SEESION_COOKIE_AGE = 60*60*24*7*2
- SESSION_EXPIRE_AT_BROWSER_CLOSE = True
- 作用:设置只要浏览器关闭时,session就失效
- 默认值:False
**Django中的session数据存储在数据库中,所以使用session前需要确保已经执行过migrate命令。
【Django session相关问题】
- django_session表是单表设计(将数据存储在一个单独的表中),且该表数据量持续增持(浏览器故意删掉sessionid&过期数据未删除)
- 可以每晚执行python3 manage.py clearsessions(该命令可删除已过期的session数据)
【Cookies和session对比】
种类 | 存储 | 安全性 |
Cookies | 浏览器 | 相对不安全 |
session | 服务器 | 相对安全 |
Cookies和Session都是用于在Web应用中跟踪和管理用户状态的机制,但它们在实现和使用方式上有一些区别。
(1)Cookies是一种在客户端(浏览器)存储数据的机制。当用户与Web应用进行交互时,服务器可以将一些数据存储在Cookies中,并随后的请求中将这些数据发送回服务器。Cookies存储在用户的浏览器中,可以设置其过期时间,被持久化在客户端,因此即使用户关闭浏览器再打开,数据仍然存在。Cookies可以存储用户的登录状态、用户偏好设置等信息。它的优点是简单易用,但它也有一些限制,比如存储容量有限,可能会受到浏览器设置的限制,还有安全性方面的一些风险(如跨站点脚本攻击)。
(2)Session是一种在服务器端存储数据的机制。当用户访问Web应用时,服务器会创建一个唯一的会话ID,并将该ID发送到用户的浏览器。浏览器在后续的请求中会将该会话ID发送回服务器,服务器通过该ID来识别和管理用户的会话状态。Session数据存储在服务器端,可以存储敏感信息,相对较安全。Session适用于存储较大和敏感的数据。然而,使用Session需要在服务器端存储和管理会话数据,增加了服务器的负担。
在一些场景下,可以单独使用Cookies或Session来管理用户状态和数据。例如,对于一些简单的应用,可以使用Cookies来存储用户的偏好设置或浏览历史记录。而对于一些需要较强安全性和大量数据存储的应用,可能选择使用Session来管理用户的登录状态和敏感数据。
此外,也可以将Cookies和Session结合起来使用。例如,使用Cookies来存储用户的唯一标识符或令牌,然后在服务器端使用该标识符或令牌来检索和管理相应的Session数据。
在实际的Web应用中,很多时候会同时使用Cookies和Session来管理用户状态和存储数据。这是因为两者各有优势,并且结合使用可以弥补彼此的不足。
通常情况下,在常见的业务中,会发现以下使用方式:
1. 登录认证:通常会使用Session来管理用户的登录状态,即在用户登录后,服务器端会创建一个Session,用于存储用户的登录信息、权限等数据,以验证用户身份。同时,可以使用Cookies来存储某种标识符或令牌,用于在用户下次访问时识别用户,以便服务器端能够恢复对应的Session。这样,用户在不同页面之间的跳转和刷新时,可以持续保持登录状态,而无需频繁重新输入用户名和密码。
2. 用户偏好设置:对于用户的偏好设置、语言选择、主题风格等信息,通常会使用Cookies来存储,以便在用户下次访问时能够自动加载用户之前的设置,提供更好的用户体验。
3. 购物车和会话数据:在电子商务应用中,通常会使用Session来管理用户的购物车数据,因为这些数据可能比较敏感且需要在服务器端进行管理,而使用Session可以提供一定的安全性和隔离性。
结合使用Cookies和Session可以充分发挥它们各自的优势,同时也需要注意安全性和隐私保护。例如,在使用Cookies时,需要注意对用户个人隐私信息的处理和安全性保护,避免泄露敏感信息。同时,对Session数据的管理也需要谨慎,避免会话劫持等安全威胁。
综合来看,常见的业务中往往会同时使用Cookies和Session来实现用户状态管理和数据存储,以提供更好的用户体验和业务功能支持。