49.1、介绍:

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

cookie的工作原理是,由服务器产生内容,浏览器收到请求后保存在本地,当浏览器再次访问时,浏览器会自动带上cookie,这样服务器就能通过

cookie的内容来判断这个是“谁”了。

2、cookie虽然在一定程度上解决了“保持状态”的需求,但是由于cookie本身最大支持4096字节,以及cookie本身保存在客户端,可能被拦截或

窃取,因此就需要有一种新的东西,它能支持更多的字节,并且他保存在服务器,有较高的安全性。这就是session。问题来了,基于http协议的无

状态特征,服务器根本就不知道访问者是“谁”,那么上述的cookie就起到桥接的作用。我们可以给每个客户端的cookie分配一个唯一的id,这样

用户在访问时,通过cookie,服务器就知道来的人是“谁”。然后我们再根据不同的cookie的id,在服务器上保存一段时间的私密资料,如“账号

密码”等等。

3、总结而言,cookie弥补了http无状态的不足,让服务器知道来的人是“谁”,但是cookie以文本的形式保存在本地,自身安全性较差,所以我

们就通过cookie识别不同的用户,对应的在session里保存私密的信息以及超过4096字节的文本。

4、另外,上述所说的cookie和session其实是共通性的东西,不限于语言和框架。

5、前几节的介绍中我们已经有能力制作一个登陆页面,在验证了用户名和密码的正确性后跳转到后台的页面。但是测试后也发现,如果绕过登陆页

面,直接输入后台的url地址也可以直接访问的,这个显然是不合理的。其实我们缺失的就是cookie和session配合的验证,有了这个验证过程,我们

就可以实现和其他网站一样必须登录才能进入后台页面了。

先说一下这种认证的机制,每当我们使用一款浏览器访问一个登陆页面的时候,一旦我们通过了认证,服务器端就会发送一组随机唯一的字符串(假

设是 123abc)到浏览器端,这个被存储在浏览端的东西就叫cookie,服务器端也会自己存储一下用户当前的状态,比如login=true,username=

hahaha 之类的用户信息。但是这种存储是以字典形式存储的,字典的唯一key就是刚才发给用户的唯一的cookie值,那么如果在服务器端查看

session信息的话,理论上就会看到如下样子的字典 {'123abc':{'login':true,'username:hahaha'}},因为每个cookie都是唯一的,所以我们在电脑上

换个浏览器再登陆同一个网站也需要再次验证。那么为什么说我们只是理论上看到这样子的字典呢,因为处于安全性的考虑,其实对于上面那个大字

典不光key值 123abc 是被加密的,value值 {'login':true,'username:hahaha'} 在服务器端也是一样被加密的,所以我们服务器上就算打开session

信息看到的也是类似与以下样子的东西 {'123abc':dasdasdasd1231231da1231231}。

49.2、cookie+session代码实现:

1、urls.py:

from django.contrib import admin

from django.urls import path

from django.conf.urls import url

from app01 import views

urlpatterns = [

path('admin/', admin.site.urls),

url(r'^login/$', views.login),

url(r'^backend/$', views.backend),

url(r'^logout/$', views.logout),

]

2、views.py:

from django.shortcuts import render,redirect

def login(request):

if request.method == "POST":

username = request.POST['username']

pwd = request.POST['passwd']

if username == 'admin' and pwd == '123456':

# 设置session内部的字典内容

request.session['is_login'] = True

request.session['username'] = 'admin'

# 登录成功就将url重定向到后台的url

return redirect('/backend/')

# 登录不成功或第一访问就停留在登录页面

return render(request, 'login.html')

def backend(request):

"""

这里必须用读取字典的get()方法把is_login的value缺省设置为False,

当用户访问backend这个url先尝试获取这个浏览器对应的session中的

is_login的值。如果对方登录成功的话,在login里就已经把is_login

的值修改为了True,反之这个值就是False的。

"""

is_login = request.session.get('is_login', False)

# 如果为真,就说明用户是正常登陆的

if is_login:

# 获取字典的内容并传入页面文件

cookie_content = request.COOKIES

session_content = request.session

username = request.session['username']

return render(request, 'backend.html',

{

'cookie_content': cookie_content,

'session_content': session_content,

'username': username

})

else:

"""

如果访问的时候没有携带正确的session,

就直接被重定向url回login页面

"""

return redirect('/login/')

def logout(request):

"""

直接通过request.session['is_login'],回去返回的时候

如果is_login对应的value值不存在会导致程序异常。所以

需要做异常处理

"""

try:

# 删除is_login对应的value值

del request.session['is_login']

except KeyError:

pass

# 点击注销之后,直接重定向回登录页面

return redirect('/login/')

3、login.html:

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>login</title>

</head>

<body>

<form action="/login/" method="post">

{% csrf_token %}

<div>用户名:<input type="text" name="username" placeholder="用户名"/></div>

<div>密 码:<input type="password" name="passwd" placeholder="密码"/></div>

<div><input type="submit" value="submit"></div>

</form>

</body>

</html>

4、backend.html:

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>backend</title>

</head>

<body>

<div>cookie内容是:{{ cookie_content }}</div>

<div>session内容是:{{ session_content }}</div>

<div>登录用户名:{{ username }}</div>

<div><a href="/logout/">注销</a></div>

</body>

</html>

5、登录测试:

(1)登录:

(2)登录成功:

1)backend.html页面:

2)通过google cookie插件查看浏览器存储的cookie:

A、

B、

C、

(3)django的session默认是存储在数据库里的,到数据库查看一下真正session内容:

(4)如果在没有登录的浏览器上直接访问http://127.0.0.1:8080/backend/地址会跳转到登录界面。

如果在已登录的浏览器上复制http://127.0.0.1:8080/backend/地址到其它未登录的浏览器上会跳转到登录界面。

49.3、总结:

1、Cookie操作:

(1)设置cookie的字典内容:

# response.set_cookie(key,value)

ret=redirect("/index/")

ret.set_cookie("is_login",True,max_age=3,expires=datetime.datetime.utcnow()+datetime.timedelta(days=3))

return ret

(2)获取cookie的字典内容:ret = request.COOKIES[key]

(3)get方法获取cookie的字典内容:ret = request.COOKIES.get(key,None)

(4)由于cookie保存在客户端的电脑上,所以,jquery也可以操作cookie。

2、Session操作:

(1)设置session内部的字典内容:reqeust.session[key] = value

(2)获取session内部的字典内容:ret = request.session[key]

(3)get方法获取session内部的字典内容:ret = request.session.get(key, None)

(4)删除session:del request.session[key]

这个删除其实就是把数据库的 session_data 更新为一个其他的值了,并没有立即删除。

(5)设置session超时时间(session默认在服务器端保存15天):

request.session.set_expiry(value)

* 如果value是个整数,session会在些秒数后失效。

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

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

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

3、Cookie原理:

(1)cookie验证原理:

1)用户登录验证成功后在服务端为cookie添加内容,发送cookie到客户端并存储(登录验证失败,由于没有在服务端为

cookie添加内容,所以不发送cookie到客户端)。

2)客户端在下次访问服务端时会带着cookie到服务端。

3)服务端从cookie中取出内容进行验证。

(2)cookie超时失效的原理:

用户登录验证成功后在服务端为cookie添加内容时会将超时间写在其中并一同发送给客户端存储,超时时间到后会将

客户端上的cookie清掉,用户再访问时因没有验证数据而需要从新验证。

(3)弊端:用户的一些私密信息会存储到客户端上,容易被窃取。

4、session原理:

(1)session验证原理:

1)用户登录验证成功后在服务端为session添加内容,在django_session表session_key、session_data字段下

生成数据且都已加密,然后将session_key的值放到cookie中以sessionid字符串方式随cookie发送到客户端存储

(登录验证失败,由于没有在服务端为session添加内容,所以不在django_session表生成数据,也不发送cookie

到客户端)。

2)客户端下次访问时带着cookie(包含sessionid)到服务端。

3)服务端从cookie中取出sessionid的值和django_session表中的session_key字段值匹配成功后取出session_data

值对用户进行验证。

(2)session超时失效原理:在服务端设置django_session表中sessionid所对应的session_data失效时间。

(3)session用户注销原理:在服务端删除django_session表中sessionid所对应的session_data中的验证key,这样

用户再次访问时因找不到相应的验证数据而需要从新验证。

(4)优点:用户的私密信息保存在服务端的django_session表中,有利与保障用户账号的安全。

5、cookie 和 session 的区别:

(1)cookie数据存放在客户的浏览器上,session数据放在服务器上。

(2)cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session。

(3)session会在一定时间内保存在服务器上,当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,

应当使用COOKIE。

(4)单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

(5)将登陆信息等重要信息存放为SESSION,其他信息如果需要保留,可以放在COOKIE中。

49、django工程(cookie+session)的更多相关文章

  1. day09 Django: 组件cookie session

    day09 Django: 组件cookie session   一.cookie和session都是会话跟踪技术     1.什么是会话             可以理解为客户端和服务端之间的一次会 ...

  2. python 全栈开发,Day76(Django组件-cookie,session)

    昨日内容回顾 1 json 轻量级的数据交换格式 在python 序列化方法:json.dumps() 反序列化方法:json.loads() 在JS中: 序列化方法:JSON.stringfy() ...

  3. Django组件-cookie,session

    昨日内容回顾: json 轻量级的数据交换格式 在python 序列化方法:json.dumps() 反序列化方法:json.loads() 在JS中: 序列化方法:JSON.stringfy() 反 ...

  4. django - 总结 - cookie|session

    Cookie是通过HTTP请求和响应头在客户端和服务器端传递的. 在Web开发中,使用session来完成会话跟踪,session底层依赖Cookie技术. --------------------- ...

  5. python框架之Django(7)-Cookie&Session使用

    Cookie 添加 response.set_cookie 添加明文cookie response.set_cookie(key, value='', max_age=None, expires=No ...

  6. Django中cookie&session的实现

    1.什么叫Cookie Cookie翻译成中文是小甜点,小饼干的意思.在HTTP中它表示服务器送给客户端浏览器的小甜点.其实Cookie是key-value结构,类似于一个python中的字典.随着服 ...

  7. Django之cookie+session

    前言 HTTP协议 是短连接.且状态的,所以在客户端向服务端发起请求后,服务端在响应头 加入cokie响应给浏览器,以此记录客户端状态: cook是来自服务端,保存在浏览器的键值对,主要应用于用户登录 ...

  8. Django之cookie&session

    cookie Cookie 是在 HTTP 协议下,服务器或脚本可以维护客户工作站上信息的一种方式.Cookie 是由 Web 服务器保存在用户浏览器(客户端)上的小文本文件,它可以包含有关用户的信息 ...

  9. Django实现cookie&session以及认证系统

    COOKIE&SESSION 知识储备 由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生. cookie的工作原理是:由服务器产生内 ...

  10. django框架--cookie/session

    目录 一.http协议无状态问题 二.会话跟踪技术--cookie 1.对cookie的理解 2.cookie的使用接口 3.cookie的属性 4.使用cookie的问题 三.会话跟踪技术--ses ...

随机推荐

  1. Win10屏幕亮度不能调节,调节无效怎么办?

    Win10屏幕亮度不能调节,调节无效怎么办? 听语音 浏览:1027 | 更新:2019-11-22 11:43 1 2 3 4 5 6 7 分步阅读 一些用户在使用win10系统之后,出现了电脑屏幕 ...

  2. 攻防世界(十一)warmup

    攻防世界系列 :warmup 1.打开题目,一个贱贱的滑稽表情 F12看到注释内容source.php 2.访问source.php <?php highlight_file(__FILE__) ...

  3. 搭建LAMP环境部署Nextcloud私人网盘

    搭建 LAMP 环境部署 Nextcloud 私人网盘 前言 Nextcloudd 是一个开源的.基于本地的文件共享和协作平台,它允许您保存文件并通过多个设备(如PC.智能手机和平板电脑)访问它们. ...

  4. centos7 安装Anaconda3及使用

    centos7 安装Anaconda3及使用原创wangshu_liang 最后发布于2019-01-31 14:08:23 阅读数 1046 收藏展开最近在服务器上安装了anaconda3,先简单说 ...

  5. 3.socket编程示例

    #block_server.py 非阻塞IO示例#有个疑惑:下面的connfd的blockind要设置为True,不然会出错,待解决from socket import *from time impo ...

  6. exit()和_exit()的区别

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/HAHAandHEHE/article/de ...

  7. 7.6 passwd:修改用户密码

    7.6 passwd:修改用户密码     passwd命令可以修改用户密码及密码过期时间等内容,是工作中很常用的命令.普通用户和超级用户都可以运行passwd命令,但普通用户只能更改自身的用户密码, ...

  8. Java中生成唯一标识符的方法

    有时候业务需要生成唯一标识符,但又不能依赖于数据库中自动递增的字段产生唯一ID,比如多表同一字段需要统一一个唯一ID,此时我们就需要用程序来生成一个唯一的全局ID. UUID UUID是指在一台机器上 ...

  9. kylin的rowkey优化之调整rowkey顺序

    在以hbase为存储的cuboid中,会有很多计算好的数据行,这每个行的key都是由维度值按顺序生成的rowkey 而这个顺序,在我们做cube设计的时候是可以调整的. 具体调整路径是:cube de ...

  10. 密码学系列之:碰撞抵御和碰撞攻击collision attack

    密码学系列之:碰撞抵御和碰撞攻击collision attack 简介 hash是密码学和平时的程序中经常会用到的一个功能,如果hash算法设计的不好,会产生hash碰撞,甚至产生碰撞攻击. 今天和大 ...