- HTTP是一种无状态的协议,为了分辨链接是谁发起的,需自己去解决这个问题。不然有些情况下即使是同一个网站每打开一个页面也都要登录一下。而Session和Cookie就是为解决这个问题而提出来的两个机制。
- 登录网站,今输入用户名密码登录了,第二天再打开很多情况下就直接打开了。这个时候用到的一个机制就是cookie。
- session一个场景是购物车,添加了商品之后客户端处可以知道添加了哪些商品,而服务器端如何判别呢,所以也需要存储一些信息就用到了session。
- 存储数据量方面:session 能够存储任意的 java 对象,cookie 只能存储 String 类型的对象
- 一个在客户端一个在服务端。因Cookie在客户端所以可以编辑伪造,不是十分安全
- Session过多时会消耗服务器资源,大型网站会有专门Session服务器,Cookie存在客户端没问题。
- 域的支持范围不一样,比方说a.com的Cookie在a.com下都能用,而www.a.com的Session在api.a.com下都不能用,解决这个问题的办法是JSONP或者跨域资源共享。
保持登录的关键不是cookie 而是通过cookie保存和传输的session ID,本质是能获取用户信息的数据
除了cookie 还有用HTTP请求头来传输,请求头不会像cookie一样自动携带,需要手动处理
cookie的一些方法
存cookie
response.set_cookie('username',username,过期时间 max_age=秒)
然后
renter 返回response
取cookie 必须要有一个变量接受
先定义变量获取cookies的属性
cookies = request.COOKIES
username = cookie.get('username','未拿到用户名')
然后返回
return HttpResponse(username)
删cookie
response.delete_cookie('username')
然后返回 response
return response
session和cookie的用法
1. Session(一般用在购物车里面,因为他默认存活周期是14天,如果用它登录的话也可以不过要设置过期时间)
(1) 设置和存session
Request.session[‘你要存在key’] = value
(2) 取session
Request.session.get(‘你存session的key值’)
(3) 删session
del request.seesion[Key]
删除对应session, Key 值不存在时,引发报错
request.session.clear()
清空 Session 中的所有数据。这里客户端还会保留 sessionid
只不过在服务端 sessionid 对应的数据没有了。
request.session.flush()
INSTALLED_APPS = (
...
'django.contrib.sessions',
...
)
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
...
)
直接删除当前客户端的的Seesion数据。这里不光服务端sessionid对应的数据没有了,客户端的sessionid也会被删除
2. Cookie(一般用在登录,因为他会随着浏览器的关闭而消亡)
(1) 设置和存cookie
Set_cookie(‘key’,value值)
reponse = HttpResponse('这是一个关于cookie的测试')
reponse.set_cookie('test','hello cookie')
return reponse
(2) 取cookie
request.COOKIES.get('key值')
(3) 删除cookie
response = HttpResponse('这是一个关于cookie的测试')
response.delete_cookie(‘key值’)
return response