前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >会话控制 COOKIE 与 SESSION

会话控制 COOKIE 与 SESSION

作者头像
星哥玩云
发布2022-09-14 18:47:30
3340
发布2022-09-14 18:47:30
举报
文章被收录于专栏:开源部署开源部署

一、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中
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、COOKIE
  • 二、session
  • 三、cookie 和session 的区别
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档