美文网首页
2019-06-19【初识cookie、session】

2019-06-19【初识cookie、session】

作者: warmsirius | 来源:发表于2019-07-31 19:12 被阅读0次

写在前面

cookie、session之前就学过,但是时间有点长忘了,刚好做项目又需要用到,写这篇文章来记录一下。

参考博文

cookie 和 session 概念

  • cookie产生背景

cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生。

  • cookie 工作原理

cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生。

  • 问题的产生

问题来了,基于http协议的无状态特征,服务器根本就不知道访问者是“谁”。那么上述的cookie就起到桥接的作用。

  • session产生背景

我们可以给每个客户端的cookie分配一个唯一的id,这样用户在访问时,通过cookie,服务器就知道来的人是“谁”。然后我们再根据不同的cookie的id,在服务器上保存一段时间的私密资料,如“账号密码”等等。

session的工作流程

1、当用户来访问服务端时,服务端会生成一个随机字符串;

2、当用户登录成功后 把 {sessionID :随机字符串} 组织成键值对加到cookie里发送给用户;

3、服务器以发送给客户端 cookie中的随机字符串做键,用户信息做值,保存用户信息;

4、再访问服务时客户端会带上sessionid,服务器根据sessionid来确认用户是否访问过网站

总结

cookie弥补了http无状态的不足,让服务器知道来的人是“谁”;但是cookie以文本的形式保存在本地,自身安全性较差;所以我们就通过cookie识别不同的用户,对应的在session里保存私密的信息以及超过4096字节的文本。

注意: 上述所说的cookie和session其实是共通性的东西,不限于语言和框架。

cookie和session的区别与联系

  • 区别
  • session将数据存储与服务器端 cookie存储在客户端
    cookie 存储在客户端,不安全,session存储在服务器端,客户端只存sesseionid,安全

  • cookie在客户端存储值有大小的限制,大约几kb。session没有限制

  • 联系

    • session基于cookie

Django设置与获取cookie

  • 设置cookie
rep = HttpResponse(...)
# rep = render(request, ...)
# rep = redirect(...)

# 设置cookie
rep.set_cookie(key,value,...) #设置cookie
rep.set_signed_cookie(key,value,salt='加密盐',...)#设置加密cookie

# 返回带cookie的页面
return rep
  • 设置cookie参数解析

rep.set_cookie(key,value,...)
rep.set_signed_cookie(key,value,salt='加密盐',...)

参数 含义
key
value=''
salt='' 加密盐,也就是加密的方式,可以自定义设置
max_age=None 超时时间
expires=None 超时时间(IE requires expires, so set it if hasn't been already.)
path='/' Cookie生效的路径,/ 表示根路径,特殊的:跟路径的cookie可以被任何url的页面访问
domain=None Cookie生效的域名
secure=False https传输
httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)
  • 获取cookie
request.COOKIES['key'] # 获取cookie
request.COOKIES.get('key') # 获取cookie

request.get_signed_cookie(key, default=RAISE_ERROR, salt='加密盐', max_age=None) # 获取加密的cookie,设置的加密盐应该和解密的加密盐一致

Django设置与获取session

Django中默认支持Session,其内部提供了5种类型的Session供开发者使用:

  • 数据库(默认)

  • 缓存

  • 文件

  • 缓存+数据库

  • 加密cookie

1、数据库Session

Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。

  • a. 配置 settings.py

SESSION_ENGINE = 'django.contrib.sessions.backends.db'# 引擎(默认)

SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)

SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径(默认)

SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默认)

SESSION_COOKIE_SECURE = False # 是否Https传输cookie(默认)

SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输(默认)

SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默认)

SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认)

SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认)
  • b. 使用
def index(request):
        # 获取、设置、删除Session中数据
        request.session['k1'] = 123

        # 设置、删除Session中数据
        request.session['k1']
        request.session.get('k1',None)
        request.session.setdefault('k1',123) # 存在则不设置

        # 删除Session中数据
        del request.session['k1']

        # 所有 键、值、键值对
        request.session.keys()
        request.session.values()
        request.session.items()
  • c. 其他用法
# 用户session的随机字符串
request.session.session_key

# 将所有Session失效日期小于当前日期的数据删除
request.session.clear_expired()

# 检查 用户session的随机字符串 在数据库中是否
request.session.exists("session_key")

 # 删除当前用户的所有Session数据
request.session.delete("session_key")


request.session.set_expiry(value)
# 1、 如果value是个整数,session会在些秒数后失效。

# 2、如果value是个datatime或timedelta,session就会在这个时间后失效。

# 3、 如果value是0,用户关闭浏览器session就会失效。

# 4、 如果value是None,session会依赖全局session失效策略。

2、缓存Session

  • a. 配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎,必须的

SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置

SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串

SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径

SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名

SESSION_COOKIE_SECURE = False  # 是否Https传输cookie

SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输

SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)

SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期

SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存

  • b. 使用

同上

3、文件Session

  • a. 配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎

SESSION_FILE_PATH = None # 缓存文件路径
# * 如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir();如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T
# * 例如:SESSION_FILE_PATH = os.path.join(BASE_DIR,'cache')   # 会创建一个cache目录,用于存放session         


SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串

SESSION_COOKIE_PATH = "/"  # Session的cookie保存的路径

SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名

SESSION_COOKIE_SECURE = False # 是否Https传输cookie

SESSION_COOKIE_HTTPONLY = True  # 是否Session的cookie只支持http传输

SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)

SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期

SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存
  • b. 使用

同上

4、缓存+数据库Session

数据库用于做持久化,缓存用于提高效率

  • a. 配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎
  • b. 使用

同上

5、加密cookie Session

  • a. 配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'   # 引擎
  • b. 使用

同上

相关文章

网友评论

      本文标题:2019-06-19【初识cookie、session】

      本文链接:https://www.haomeiwen.com/subject/ovqxdctx.html