欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Django-会话跟踪cookie和session

程序员文章站 2024-03-20 10:54:52
...

Django-会话跟踪cookie和session

HTTP协议 是短连接、且状态的,所以在客户端向服务端发起请求后,服务端在响应头 加入cokie响应给浏览器,以此记录客户端状态。

Cookie是来自服务端,保存在浏览器的键值对,主要应用于用户登录;

1.cookie

1.1Cookie的产生

HTTP协议是无状态的。

无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不会直接影响后面的请求响应情况,因此对于服务器来说每一次请求都是全新的,在会话中产生的数据并不会保存,为了保存数据Cookie应运而生。

1.2Cookie的原理

由服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上Cookie。

1.3Cookie的格式

request.COOKIES['key']
request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
  • key:这个cookie的key。

  • value:这个cookie的value。

  • max_age=1 :cookie生效的时间,单位是秒

  • expires:具体过期日期

  • path=’/’:指定那个url可以访问到cookie;‘/’是所有; path=’/’

  • domain=None(None代表当前域名):指定那个域名以及它下面的二级域名(子域名)可以访问这个cookie

  • secure=False:https安全相关

  • httponly=False:限制只能通过http传输,JS无法在传输中获取和修改

1.4Cookie的操作

1.4.1创建

response创建

  • 不加盐
def cookie_set(request):
    response = HttpResponse('')
    response.set_cookie(key='xqb', value={'yy': '123123'}, max_age=20)
    print('-----------------------------------------------')
    return response
  • 加盐
def cookie_set(request):
    response = HttpResponse('')
    response.set_cookie(key='xqb', value={'yy': '123123'}, max_age=20,salt='123')
    print('-----------------------------------------------')
    return response

1.4.2获取

request获取

  • 不加盐
def get_cookie(request):
    get_cookie_from_cookie = request.COOKIES.get('xqb')
    print(type(request.COOKIES.get('xqb')))
    return HttpResponse(get_cookie_from_cookie)
  • 加盐
def get_cookie(request):
    get_cookie_from_cookie = request.COOKIES.get('xqb',salt='123')
    print(type(request.COOKIES.get('xqb')))
    return HttpResponse(get_cookie_from_cookie)

1.4.2删除

使用delete_cookie来删除,实际上删除cookie就是将指定的cookie的值设置为空的字符串,然后使用将他的过期时间设置为0,也就是浏览器关闭后就过期。

def delete_cookie(request):
	response = HttpResponse("ok")
	response.delete_cookie("user_id")
	return response

2.session

2.1session的产生

cookie看似解决了HTTP(短连接、无状态)的会话保持问题,但把全部用户数据保存在客户端,存在安全隐患,

于是cookie+session出现了!我们可以 把关于用户的数据保存在服务端,在客户端cookie里加一个sessionID(随机字符串),

基于以上原因:cook+session组合就此作古了单单使用cookie做会话保持的方式

Session依赖Cookie!但与Cookie不同的地方在于Session将所有的数据都放在服务器端,用户浏览器的Cookie中只会保存一个非明文的识别信息,比如哈希值。

Session是大多数网站都需要具备的功能。Django为我们提供了一个通用的Session框架,并且可以使用多种session数据的保存方式:

  • 保存在数据库内
  • 保存到缓存
  • 保存到文件内
  • 保存到cookie内

通常情况,没有特别需求的话,请使用保存在数据库内的方式,尽量不要保存到Cookie内。

Django的session框架支持匿名会话,封装了cookies的发送和接收过程。cookie包含一个会话ID而不是数据本身(除非你使用的是基于后端的cookie)。

Django的会话框架完全地、唯一地基于Cookie。它不像PHP一样,把会话的ID放在URL中。那样不仅使得URL变得丑陋,还使得你的网站易于受到通过"Referer"头部进行窃取会话ID的攻击。

2.2.1session的创建

使用request

def set_session(request):
    request.session['user'] = 'rob'
    return HttpResponse('session 设置')

2.2.2session的获取

同样使用request

def get_session(request):
    get_session_data = request.session.get('user')
    return HttpResponse(get_session_data)

2.2.3删除

request.session.flush()

2.2.4删除session中的指定键及值

del request.session[‘key’]

2.2.5设置会话的超时时间 单位s

request.session.set_expiry(value):

  • 如果value是个datatime或timedelta,session就会在这个时间后失效。
  • 如果value是0,用户关闭浏览器session就会失效。
  • 如果value是None,session会依赖全局session失效策略

3.cookie和session的联系和区别

1.cookie和session都是会话技术,cookie是运行在客户端,session是运行在服务器端。

2.cookie由大小限制以及浏览器在存cookie的个数也是有限的,session是没有大小限制和服务器的内存大小有关。

3.cookie由安全隐患,通过拦截或本地找到cookie后可以进行攻击。

4.session是保存子服务器端上,存在一段时间才会消失,如果session过多会增加服务器的压力。