COOKIESESSION和CACHE

Posted yangjunh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了COOKIESESSION和CACHE相关的知识,希望对你有一定的参考价值。

因为浏览器没有状态,不能保持链接

一、Cookie

1、特点

  • cookie将一段文本长时间保存在客户端(浏览器)
  • 最大支持4096字节

  • cookies是保存在客户端浏览器上的存储空间,通常用来记录浏览器端自己的信息和当前连接的确认信息
  • cookies 在浏览器上是以键-值对的形式进行存储的,键和值都是以ASCII字符串的形存储(不能是中文字符串)
  • 每次向服务器发送请求时,都会把 cookie 中的数据封装到request.cookies中带到服务器,如果cookies过大会降低响应速度

2、cookie的使用场合

1.记住密码
2.记住搜索关键词

def fun(request)
# 创建响应对象
resp = make_response("响应字符串")  
resp = redirect('地址')  
resp = render_template('模板')
# 增/改
resp.set_cookie(key,value,age)
# 删
resp.delete_cookie(key)
# 返回响应对象
return resp

# 查
request.cookies['key']  
request.cookies.get('key',value)可以设置默认值,没有找到是付给key
from django.http import HttpResponse
# 创建响应对象
resp = HttpResponse()
render(request,'xxx.html',locals())
# 增/改
resp.set_cookie(key, value='', max_age=None, expires=None)
# 删
HttpResponse.delete_cookie(key)
# 返回响应对象
return resp

# 查
request.COOKIES.get('key',value)

5、Tornado中使用cookie

cookie = self.get_cookie()/self.get_secure_cookie()
self.set_cookie()/self.set_secure_cookie()

二、Session

1、特点

  • session又名会话控制,是在服务器上开辟一段空间用于保留浏览器和服务器交互时的重要数据
  • session的起源
    • http协议是无状态的:每次请求都是一次新的请求,不会记得之前通信的状态
    • 实现状态保持的方式:在客户端或服务器端存储与会话有关的数据
    • 推荐使用sesison方式,所有数据存储在服务器端

2、Session 在 Flask 中的实现

from flask import session

# 配置 SECRET_KEY作为session的加密盐值
app.config['SECRET_KEY'] = "string"

# 增/改 
session['key'] = value  
# 删、
del session[key]
value = session.pop(key)
session.clear()
# 查
value = session['key'] 

flask将数据加密后存储回cookie中flask_session(可以认为是分布式储存),flask需要安装flask_session,才能将session真正存储到mysql中

# 过期时间
app.config[ 'PERMANENT_SESSION_LIFETIME' ] = timedelta( days=7 )

session.permanent = True

3、Session 在 Django 中的实现

  • 特征

    • 使用 session 需要在浏览器客户端启动 cookie,且在cookie中存储session_id

    • 每个客户端都可以在服务器端有一个独立的Session,一一对应

    • session对于象是一个在似于字典的SessionStore类型的对象, 可以用类拟于字典的方式进行操作

    • 只能够存储能够序列化的数据,如字典,列表等

    • Django存储在mysql的django_session中

      • 默认14天,每次存session重新计算更新时间
      • 缺点:所有数据存在django_session一个文件上
      • 优化:
        • mysql分表redis -分库
        • 每天固定python3 manage.py clearsessions删除过期的session数据
    • 当使用session时需要迁移数据库,否则会出现错误

      $ python3 manage.py makemigrations
      $ python3 manage.py migrate
  • 操作

# 启用Session--settings.py
INSTALLED_APPS = [
    # 启用 sessions 应用
'django.contrib.sessions',
]
MIDDLEWARE = [
    # 启用 Session 中间件
'django.contrib.sessions.middleware.SessionMiddleware',
]
SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 2
指定sessionid在cookies中的保存时长(默认是2周),如下:
SESSION_EXPIRE_AT_BROWSER_CLOSE = True
设置只要浏览器关闭时,session就失效(默认为False)  

def fun(request)
# 增/改
request.session['KEY'] = VALUE
# 删
del request.session['KEY']
request.session.clear_expired() 删除过期的

# 查
VALUE = request.session['KEY']
VALUE = request.session.get('KEY', 缺省值)
keys_list = request.session.keys()
values_list = request.session.values()
items_list = request.session.items()
secury-key = request.session.session_key()

三、session与cookie 比较

相同:都用于保存数据

不同点 储存位置 储存时间 安全性 提交方式
session 服务器 临时 服务器调度
cookie 浏览器 永久 自动提交

四、使用

  • session使用一般必须结合cookie
  • session必须存,存储在服务器,时间短,如果用户希望长时间保存,cookie一份
  • session 的运行依赖 session id,而 session id 是存在 cookie 中的,也就是说,如果浏览器禁用了 cookie ,同时 session 也会失效
  • 先检查session再检查cookie回写session
  • 有session登录,没session看cookie,有cookie登录存到session,也没cookie去登录

五、 缓存Cache

类型

  • 强缓存(动态资源):

    • 不会向服务器发送请求,直接从缓存中读取资源
    • Expires
      • 缓存过期时间,用来指定资源到期的时间,是服务器端的具体的时间点
      • Expires=max-age + 请求时间
      • HTTP/1.0 的产物,受限于本地时间,如 果修改了本地时间,可能会造成缓存失效
    • Cache-Control
      • 在HTTP/1.1中,Cache-Control主要用于控制网页缓存。
      • 不受本地时间控制,按UTC
    • Expires VS Cache-Control
      • expires 1.0协议缓存头-绝对时间,cc 1.1新版本缓存头-相对时间
      • 根据http要求,缓存头响应时,会同时将expires旧头和cache-control新头返回给浏览器但是,浏览器去的最新版本头缓存[结合浏览器支持的http协议]
  • 协商缓存(静态资源)

    • Last-Modified和if-Modified-since

      • 强制缓存失效后,浏览器携带缓存标识向服务器发起请求,服务器根据缓存标识决定是否使用缓存的过程

      • 服务器响应返回静态文件响应头包含Last-Modified(资源的最近一次修改时间)

      • 浏览器接到服务器相应后检查Last-Modified,有则储存到浏览器缓存中,缓存时间根据各浏览器不同

        火狐:(现在时间-上次时间)/10作为当次缓存时间

      • 当浏览器再次发送该资源请求时,优先检查缓存中是否已经有缓存数据,

        • 有缓存,未过期,不向服务器发送请求直接返回

        • 有缓存,已失效,发送‘协商请求’到服务器,请求头中包含if -Modified-since,值为last-modified

          • 服务器接到if -Modified-since,检查是否和该资源文件的最近修改时间相等

            相等:证明资源没变,返回304响应状态码

            不相等,证明资源有修改过,返回200响应状态码,且响应具体新的资源内容

        • 无缓存,正常发送请求至服务器[F5+ctrl绝对不走缓存],取得最新资源

      • 缺点:只能精确到秒,容易发生单秒内多次修改,检测不到

    • ETag和If-None-Match

  • 流程和Last-Modified相同,但返回资源文件唯一标识(由服务器hash生成),任何改变都能捕捉更精确

  • Last-Modified VS ETag

    • 精度不一样 - Etag 高

    • 性能上 - Last-Modifi 高

      • 优先级 - Etag 高

以上是关于COOKIESESSION和CACHE的主要内容,如果未能解决你的问题,请参考以下文章

关于mysql驱动版本报错解决,Cause: com.mysql.jdbc.exceptions.jdbc4Unknown system variable ‘query_cache_size(代码片段

Yii2片段缓存详解

隐藏表单域URL重写cookiesession

Connect/Express 中的“session”和“cookieSession”中间件有啥区别?

CookieSession和Token

CookieSession