.cookie和session的介绍

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

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

cookie虽然在一定程度上解决了“保持状态”的需求,但是由于cookie本身最大支持4096字节,以及cookie本身保存在客户端,可能被拦截或窃取,因此就需要有一种新的东西,它能支持更多的字节,并且他保存在服务器,有较高的安全性。这就是session。

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

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

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

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

二.Cookie概述

1.什么叫Cookie

Cookie翻译成中文是小甜点,小饼干的意思。在HTTP中它表示服务器送给客户端浏览器的小甜点。其实Cookie是key-value结构,类似于一个python中的字典。随着服务器端的响应发送给客户端浏览器。然后客户端浏览器会把Cookie保存起来,当下一次再访问服务器时把Cookie再发送给服务器。 Cookie是由服务器创建,然后通过响应发送给客户端的一个键值对。客户端会保存Cookie,并会标注出Cookie的来源(哪个服务器的Cookie)。当客户端向服务器发出请求时会把所有这个服务器Cookie包含在请求中发送给服务器,这样服务器就可以识别客户端了!

2.Cookie的原理

cookie的工作原理是:浏览器访问服务端,带着一个空的cookie,然后由服务器产生内容,浏览器收到相应后保存在本地;当浏览器再次访问时,浏览器会自动带上Cookie,这样服务器就能通过Cookie的内容来判断这个是“谁”了。

2.查看Cookie

    我们使用Chrome浏览器,打开开发者工具。 

3.cookie图解

4.Cookie规范

Cookie大小上限为4KB;

 一个服务器最多在客户端浏览器上保存20个Cookie;

 一个浏览器最多保存300个Cookie,因为一个浏览器可以访问多个服务器。

    上面的数据只是HTTP的Cookie规范,但在浏览器大战的今天,一些浏览器为了打败对手,为了展现自己的能力起见,可能对Cookie规范“扩展”了一些,例如每个Cookie的大小为8KB,最多可保存500个Cookie等!但也不会出现把你硬盘占满的可能!

注意,不同浏览器之间是不共享Cookie的。也就是说在你使用IE访问服务器时,服务器会把Cookie发给IE,然后由IE保存起来,当你在使用FireFox访问服务器时,不可能把IE保存的Cookie发送给服务器。

5.Cookie与HTTP头

Cookie是通过HTTP请求和响应头在客户端和服务器端传递的:

Cookie:请求头,客户端发送给服务器端;

格式:Cookie: a=A; b=B; c=C。即多个Cookie用分号离开; l Set-Cookie:响应头,服务器端发送给客户端;

一个Cookie对象一个Set-Cookie: Set-Cookie: a=A Set-Cookie: b=B Set-Cookie: c=C

6.Cookie的覆盖

如果服务器端发送重复的Cookie那么会覆盖原有的Cookie,例如客户端的第一个请求服务器端发送的Cookie是:Set-Cookie: a=A;第二请求服务器端发送的是:Set-Cookie: a=AA,那么客户端只留下一个Cookie,即:a=AA。

三.Django中cookie的简单使用

Ctrl + Shift + del三个键来清除页面缓存和cookie,将来这个操作你会用的很多。

1.获取Cookie

request.COOKIES.get("islogin",None)  #如果有就获取,没有就默认为none

request.COOKIES['key']

request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)

参数:

default: 默认值

salt: 加密盐

max_age: 后台控制过期时间

2.设置Cookie

obj = redirect("/index/")

obj.set_cookie("islogin",True)  #设置cookie值,注意这里的参数,一个是键,一个是值

obj.set_cookie("haiyan","344",20)  #20代表过期时间

obj.set_cookie("username", username)

例子2:

rep = HttpResponse(...)

rep = render(request, ...)

rep.set_cookie(key,value,...)

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

参数:

key, 键

value='', 值

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获取(不是绝对,底层抓包可以获取到也可以被覆盖)

3.删除Cookie

obj.delete_cookie("cookie_key",path="/",domain=name)

def logout(request):

rep = redirect("/login/")

rep.delete_cookie("user")  # 删除用户浏览器上之前设置的usercookie值

return rep

登录认证示例:

需要知道几点

一共有三次请求

  注意:form表单的action走的路径还是/login/

     第一次请求:url:http://127.0.0.1:8080/login get请求

       第一次请求:url:http://127.0.0.1:8080/login post请求 user pasw

       第一次请求:url:http://127.0.0.1:8080/index post请求 携带着cookie的了

       所以在index页面中就会取到cookie,因为这是的index里面已经有cookie了

cookie存储到客户端

优点:数据存储在客户端。减轻服务端的压力,提高网站的性能

缺点:安全性不高,在客户端很容易被查看或破解用户会话信息

4.用户注销删除cookie页面访问案例

例:

urls.py

from cookie import views

urlpatterns = [

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

path('login/', views.login),

path('index/', views.index),

path('logout/', views.logout),

path('order/', views.order),

]

views.py

from django.shortcuts import render, HttpResponse, redirect

from cookie import models

def login(request):

if request.method == "GET":

return render(request, "login.html")

username = request.POST.get("username")

password = request.POST.get("pwd")

user_obj = models.Userinfo.objects.filter(username=username, password=password).first()

if not user_obj:

return redirect("/login/")

else:

rep = redirect("/index/")

rep.set_cookie("is_login", True)

# rep.set_cookie("username",user_obj.name)

return rep

def index(request):

status = request.COOKIES.get("is_login")  # cookie的提交数据

if not status:

return redirect('/login/')

return render(request, "index.html")

# 同理index页面的限制

def order(request):

status = request.COOKIES.get("is_login")  # cookie的提交数据

if not status:

return redirect('/login/')

return render(request, "order.html")

def logout(request):

rep = redirect('/login/')

# 注销后删除cookie,访问index将访问不了,这样可以限制没有登录的用户对index页面的访问

rep.delete_cookie("is_login")

return rep

前端三个页面的内容为:

login.html

<body>

<h3>用户登录</h3>

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

{% csrf_token %}

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

<p>密码  :<input type="password" name="pwd"></p>

<input type="submit">

</form>

</body>

index.html

<body>

<p>index 页面。。。。</p>

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

</body>

order.html

<body>

<p>order 页面。。。。</p>

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

</body>

四.Django 中session的简单使用

1.Session介绍

Session是服务器端技术,利用这个技术,服务器在运行时可以 为每一个用户的浏览器创建一个其独享的session对象,由于 session为用户浏览器独享,所以用户在访问服务器的web资源时 ,可以把各自的数据放在各自的session中,当用户再去访问该服务器中的其它web资源时,其它web资源再从用户各自的session中 取出数据为用户服务。

2.Session图解

3.为什么需要Session

Cookie虽然在一定程度上解决了“保持状态”的需求,但是由于Cookie本身最大支持4096字节,以及Cookie本身保存在客户端,可能被拦截或窃取,因此就需要有一种新的东西,它能支持更多的字节,并且他保存在服务器,有较高的安全性。这就是Session。

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

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

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

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

4.基本操作

(1)设置session值

    request.session["session_name"]="admin"

(2)获取session值

    session_name = request.session("session_name")

(3)删除session值

    del request.session["session_name"]  删除一组键值对

    request.session.flush()   删除一条记录

(4)检测是否操作session值

    if "session_name"  is request.session:

其他操作:

(5)get(key, default=None)

fav_color = request.session.get('fav_color', 'red')

(6)pop(key)

fav_color = request.session.pop('fav_color')

(7)keys()

(8)items()

(9)setdefault()

(10)flush() 删除当前的会话数据并删除会话的Cookie。

这用于确保前面的会话数据不可以再次被用户的浏览器访问

例如,django.contrib.auth.logout() 函数中就会调用它。

(11)用户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)

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

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

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

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

5.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,默认修改之后才保存(默认)

6.session案例

urls.py

from session import views as session_views

urlpatterns = [

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

path('session_login/', session_views.login),

path('s_index/', session_views.s_index),

path('s_logout/', session_views.s_logout),

]

views.py

from django.shortcuts import render, HttpResponse, redirect

from session import models

# Create your views here.

def login(request):

if request.method == "GET":

return render(request, "login.html")

username = request.POST.get("username")

password = request.POST.get("pwd")

user_obj = models.Userinfo.objects.filter(username=username, password=password).first()

if not user_obj:

return redirect("/login/")

else:

rep = redirect("/index/")

rep.set_cookie("is_login", True)

# rep.set_cookie("username",user_obj.name)

return rep

def index(request):

status = request.COOKIES.get("is_login")  # cookie的提交数据

if not status:

return redirect('/login/')

return render(request, "index.html")

# 同理index页面的限制

def order(request):

status = request.COOKIES.get("is_login")  # cookie的提交数据

if not status:

return redirect('/login/')

return render(request, "order.html")

def logout(request):

rep = redirect('/login/')

# 注销后删除cookie,访问index将访问不了,这样可以限制没有登录的用户对index页面的访问

rep.delete_cookie("is_login")

return rep

s_index.html

<body>

<p>session index 页面。。。。</p>

<a href="/s_logout/">注销</a>

</body>

</body>

关于session存在和消失的时候:

Django 学习之cookie与session的更多相关文章

  1. Django学习之Cookie和Session

    一.Cookie 1.Cookie的由来 2.什么是Cookie 3.Cookie的原理 4.查看Cookie 二.Django中操作Cookie 1.获取Cookie 2.设置Cookie 3.删除 ...

  2. {Django基础八之cookie和session}一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session

    Django基础八之cookie和session 本节目录 一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session 六 xxx 七 ...

  3. Django框架 之 Cookie、Session整理补充

    Django框架 之 Cookie.Session整理补充 浏览目录 Django实现的Cookie Django实现的Session 一.Django实现的Cookie 1.获取Cookie 1 2 ...

  4. 【python】-- Django 分页 、cookie、Session、CSRF

    Django  分页 .cookie.Session.CSRF 一.分页 分页功能在每个网站都是必要的,下面主要介绍两种分页方式: 1.Django内置分页 from django.shortcuts ...

  5. Django框架 之 Cookie和Session初识

    Django框架 之 Cookie和Session初识 浏览目录 Cookie介绍 Django中的Cookie Session 一.Cookie介绍 1.Cookie产生的意义 众所周知,HTTP协 ...

  6. Django框架07 /cookie和session

    Django框架07 /cookie和session 目录 Django框架07 /cookie和session 1. django请求生命周期 2. cookie 3. session 4. 总结 ...

  7. Django学习手册 - cookie / session

    cookie """ cookie属性: obj.set_cookie(key,value,....) obj.set_signed_cookie(key,value,s ...

  8. Django:Admin,Cookie,Session

    一. Admin的配置 1.Admin基础设置 admin是django强大功能之一,它能够从数据库中读取数据,呈现在页面中,进行管理.默认情况下,它的功能已经非常强大,如果你不需要复杂的功能,它已经 ...

  9. Django中的cookie与session

    cookie与session的实现原理 HTTP被设计为”无状态”,每次请求都处于相同的空间中. 在一次请求和下一次请求之间没有任何状态保持,我们无法根据请求的任何方面(IP地址,用户代理等)来识别来 ...

随机推荐

  1. LeetCode 组合总和(dfs)

    题目 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的数字可以无限制重 ...

  2. MyBatis操作mysql数据库查询出来是时间戳的问题

    在pojo类中用java.sql.Date接收就能正常显示

  3. js的split() 方法和join()方法

    定义和用法 split() 方法用于把一个字符串分割成字符串数组. String.split() 执行的操作与 Array.join 执行的操作是相反的. join() 方法用于把数组中的所有元素放入 ...

  4. 五、request模块

    描述:requests是python的一个第三方HTTP(Hypertext Transfer Protocol,超文本传输协议)库,它比python自带的网络库urllib更加简单.方便和人性化:使 ...

  5. 【Struts 基础案例】

    LoginAction package k.action; import k.form.UserForm; import org.apache.struts.action.*; import java ...

  6. Java方法升级

    1. 方法格式 package cn.itcast.day04.demo02; /* 方法其实就是若干语句的功能集合. 方法好比是一个工厂. 蒙牛工厂 原料:奶牛.饲料.水 产出物:奶制品 钢铁工厂 ...

  7. 解决安装 fireworks、photoshop 时卡在输入账号、手机号处等问题

    一定要断网! 一定要断网! 一定要断网! 重要的事情说三遍! 我安装的是破解版CS6系列: 安装步骤如下: 1.当进行安装到此步时,(前面的步骤为解压文件等便不解释),选择“试用”,此时应该是 断网  ...

  8. Android 调起系统相机拍照

    概述 最近在看 nanChen 写的图片选择器 ImagePicker,感觉写得很不错,也打算把从中学到的东西写下来.很多时候,遇到一个好的框架能够降低开发成本这是好事.但是也要去了解其内部具体实现逻 ...

  9. rsync安装与配置使用 数据同步方案(centos6.5)

    rsync + crond   ==定时数据同步 sersync(inotify)  + rsync  ==实时数据同步,利用rsync实现 ##应用场景 ..1 主备服务器之间同步数据定时    = ...

  10. VScode使用入门

    使用命令行打开 vscode 如何获取code命令 一般来说,当windows安装了vscode之后,重启之后就可以使用 code 这个命令 也可以直接将vscode直接加入到环境变量中进行使用 命令 ...