会话控制 COOKIE 与 SESSION

2022-09-14 18:47:30 浏览数 (1)

一、COOKIE

概述

会话控制 用来保持用户的状态 具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案

原因

http协议时无状态的

每一次请求都是一次新的请求,不会记得之前的通信状态

值的存储

cookie存储在客户端的浏览器 一般会限制存储cookie的个数为 20个 并且单个cookie保存值的大小不能超过4kb 存储在浏览器上为明文存储 所以不安全

设置cookie

格式

Response.set_cookie()

参数:

  • key cookie的键
  • value cookie的值
  • max_age 秒为单位的cookie寿命 None表示浏览器关闭时
  • expires 失效时间 datetime对象或unix时间戳
  • path 生效的路径
  • domain 生效的域名
  • secure HTTPS传输时应设置为true
  • httponly 仅http传输 不能使用js获取cookie

实例

代码语言:javascript复制
<span class="hljs-comment"># 设置cookie</span>
<span class="hljs-meta">@app.route('/set_cookie/')</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">set_cookie</span><span class="hljs-params">()</span>:</span>
    res = make_response(<span class="hljs-string">'cookie已设置'</span>)
    <span class="hljs-comment"># 设置cookie</span>
    res.set_cookie(<span class="hljs-string">'name'</span>, <span class="hljs-string">'lucky'</span>)
    <span class="hljs-keyword">return</span> res

注意:

不设置过期时间 默认存活为浏览会话结束 也就是关闭浏览器 而不是关闭标签页

获取cookie

代码语言:javascript复制
<span class="hljs-comment"># 获取cookie</span>
<span class="hljs-meta">@app.route('/get_cookie/')</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">get_cookie</span><span class="hljs-params">()</span>:</span>
    <span class="hljs-keyword">return</span> request.cookies.get(<span class="hljs-string">'name'</span>) <span class="hljs-keyword">or</span> <span class="hljs-string">'不存在'</span>

移除cookie

代码语言:javascript复制
<span class="hljs-meta">@axf.route("/deleteCookie/")</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">deleteCookie</span><span class="hljs-params">()</span>:</span>
    response = make_response(<span class="hljs-string">"删除名为lucky的cookie"</span>)
    <span class="hljs-comment">#response.set_cookie('name','',expires=0)  </span>
    <span class="hljs-comment"># 键</span>
    response.delete_cookie(<span class="hljs-string">"name"</span>)
    <span class="hljs-keyword">return</span> response

设置cookie并设置过期时间

代码语言:javascript复制
<span class="hljs-comment"># 设置cookie</span>
<span class="hljs-meta">@app.route('/set_cookie/')</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">set_cookie</span><span class="hljs-params">()</span>:</span>
    resp = make_response(<span class="hljs-string">'cookie已设置'</span>)
    <span class="hljs-comment"># 设置cookie,可以指定过期时间 下面均为10秒后过期s</span>
    expires = time.time()   <span class="hljs-number">10</span>
    resp.set_cookie(<span class="hljs-string">'name'</span>, <span class="hljs-string">'lucky'</span>, expires=expires)
    <span class="hljs-comment">#resp.set_cookie('name', 'lucky', max_age=10)</span>
    <span class="hljs-keyword">return</span> resp

二、session

概述

  • 服务器需要识别来自同一访问者的请求。这主要是通过浏览的cookie实现的。 访问者在第一次访问服务器时,服务器在其cookie中设置一个唯一的ID号——会话ID。 这样,访问者后续对服务器的访问头中将自动包含该信息,服务器通过这个ID号,即可区 隔不同的访问者。
  • Flask框架中,每当一个请求进来时会自动根据请求中cookie的会话ID创建 一个Session类的实例对象(会话ID的键 默认为session

缓存共同配置

代码语言:javascript复制
<span class="hljs-comment"># session是否长期有效,如果为False则关闭浏览器session失效</span>
SESSION_PERMANENT = <span class="hljs-keyword">True</span>
<span class="hljs-comment"># session长期有效,则设定session的生命周期,单位是秒</span>
PERMANENT_SESSION_LIFETIME = <span class="hljs-number">60</span> * <span class="hljs-number">60</span> * <span class="hljs-number">24</span> * <span class="hljs-number">14</span>
<span class="hljs-comment"># 是否强制加盐(密)混淆session(是否对发送到浏览器上的session的cookie值进行加密)</span>
SESSION_USE_SIGNER = <span class="hljs-keyword">True</span>
<span class="hljs-comment"># 如果加盐须设置安全码 必须设置否则报错</span>
SECRET_KEY = str(uuid.uuid4())

本地缓存

代码语言:javascript复制
<span class="hljs-comment"># session存储模式</span>
SESSION_TYPE = <span class="hljs-string">"null"</span>

如果作为测试都写在一个文件中 也可以进行下面写法

代码语言:javascript复制
app.secret_key = <span class="hljs-string">'sth. random as a encrypt key.'</span>
或者
app.config[<span class="hljs-string">'SECRET_KEY'</span>] = <span class="hljs-string">'sth. random as a encrypt key.'</span>
<span class="hljs-string">"""
config:是一个字典的一个子类,能像字典一样被修改
注意:配置的选项必须大写
"""</span>

存储在redis

安装

pip install redis

pip install flask-session

配置文件中导入

from redis import Redis

配置

代码语言:javascript复制
<span class="hljs-comment"># session存储模式</span>
SESSION_TYPE = <span class="hljs-string">"redis"</span>
<span class="hljs-comment"># 存储到redis中键的前缀</span>
SESSION_KEY_PREFIX = <span class="hljs-string">"session:"</span>
<span class="hljs-comment">#redis服务器配置,默认使用0库</span>
SESSION_REDIS = Redis(
    host=<span class="hljs-string">"127.0.0.1"</span>,
    port=<span class="hljs-string">"6379"</span>,
    password=<span class="hljs-string">"123456"</span>
)

创建三方对象

exts/sess.py

代码语言:javascript复制
<span class="hljs-keyword">from</span> flask_session <span class="hljs-keyword">import</span> Session
sess = Session()

exts/__init__.py

代码语言:javascript复制
<span class="hljs-keyword">from</span> exts.sess <span class="hljs-keyword">import</span> sess

app加载三方对象

代码语言:javascript复制
<span class="hljs-keyword">from</span> exts <span class="hljs-keyword">import</span> sess
sess.init_app(app)

存储在 数据库

配置

代码语言:javascript复制
<span class="hljs-comment"># session存储模式</span>
SESSION_TYPE = <span class="hljs-string">"sqlalchemy"</span>
<span class="hljs-comment">#操作数据的对象</span>
SESSION_SQLALCHEMY = db
<span class="hljs-comment">#数据库中使用的表名</span>
SESSION_SQLALCHEMY_TABLE = <span class="hljs-string">"session"</span>

设置session

在视图函数内,Flask提供了一个全局对象session,它始终等效于当前请求所对应的 Session类实例对象。Session类定义了get_item()方法和set_item()方法, 因此我们可以像使用Dict对象一样,通过[]操作符读取或设置会话变量

代码语言:javascript复制
<span class="hljs-keyword">from</span> flask <span class="hljs-keyword">import</span> session

<span class="hljs-comment"># 设置session</span>
<span class="hljs-meta">@app.route('/set_session/')</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">set_session</span><span class="hljs-params">()</span>:</span>
    session[<span class="hljs-string">'name'</span>] = <span class="hljs-string">'lucky'</span>
    <span class="hljs-keyword">return</span> <span class="hljs-string">'设置session'</span> 

设置session及过期时间

timedalte 是datetime中的一个对象,该对象表示两个时间的差值

构造函数:datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)

代码语言:javascript复制
<span class="hljs-meta">@app.route('/set_session_lifetime/')</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">set_session_lifetime</span><span class="hljs-params">()</span>:</span>
    <span class="hljs-keyword">from</span> datetime <span class="hljs-keyword">import</span> timedelta
    session.permanent = <span class="hljs-keyword">True</span>  <span class="hljs-comment"># 持久化</span>
    app = current_app._get_current_object() <span class="hljs-comment">#获取实例化的flask对象app</span>
    app.permanent_session_lifetime = timedelta(minutes=<span class="hljs-number">5</span>)
    session[<span class="hljs-string">'age'</span>] = <span class="hljs-number">18</span>
    <span class="hljs-keyword">return</span> <span class="hljs-string">'设置session及过期时间'</span>

获取session

代码语言:javascript复制
<span class="hljs-comment"># 获取session</span>
<span class="hljs-meta">@app.route('/get_session/')</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">get_session</span><span class="hljs-params">()</span>:</span>
    <span class="hljs-keyword">return</span> session.get(<span class="hljs-string">'name'</span>, <span class="hljs-string">'who are you ?'</span>)

删除session

代码语言:javascript复制
<span class="hljs-meta">@app.route("/delete_session/")</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">delete_session</span><span class="hljs-params">()</span>:</span>
    <span class="hljs-comment"># 删除名为nice的session</span>
    session.pop(<span class="hljs-string">"name"</span>, <span class="hljs-keyword">None</span>)
    <span class="hljs-comment"># 移除所有session</span>
    <span class="hljs-comment"># session.clear()</span>
    <span class="hljs-keyword">return</span> <span class="hljs-string">"删除session"</span>

三、cookie 和session 的区别

  • cookie数据存放在客户的浏览器上,session数据放在服务器上。
  • cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗 ,考虑到安全应当使用session
  • session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能 考虑到减轻服务器性能方面,应当使用COOKIE
  • 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie
  • 所以个人建议 将登陆信息等重要信息存放为SESSION 其他信息如果需要保留,可以放在COOKIE中

0 人点赞