会话跟踪技术--Cookie

2.cookie知识介绍

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

注意:

  • cookie:饼干:具体一个浏览器针对一个服务器存储的key value{}结构
  • 针对不同服务器,相应的浏览器储存不同的key value,而且一般有时间限制.
  • 一个浏览器访问了服务器如果得到了Cookie,接下来不管访问该服务器的任何路径都会带上这个Cookie
  • 一个浏览器对于同一个服务器可以同时储蓄多个Cookie,可以给跟新
  • csrftoken是Django中间件自带的(后面会讲)

Cookie规范

  • Cookie大小上限为4KB;
  • 一个服务器最多在客户端浏览器上保存20个Cookie;
  • 一个浏览器最多保存300个Cookie;

注意:

  • 浏览器可能对Cookie规范“扩展”了一些,例如每个Cookie的大小为8KB,最多可保存500个Cookie等!
  • 不同浏览器之间是不共享Cookie的。

**Cookie与HTTP头 **

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

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

Cookie的覆盖

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

django中的cookie语法

设置cookie:

response = HttpResponse(...) 或
response = render(request, ...) 或
response = redirect()

response.set_cookie(key,value,...)
response.set_signed_cookie(key,value,salt='加密盐',...)

设置cookie源码对应的参数

class HttpResponseBase:

def set_cookie(self, key, 键
   value='',      值
   max_age=None,  超长时间 IE浏览器不支持
      cookie需要延续的时间(以秒为单位)
      如果参数是\ None`` ,这个cookie会延续到浏览器关闭为止。

   expires=None,  超长时间
      expires默认None ,cookie失效的实际日期/时间。
                            

   path='/',  Cookie生效的路径,
         浏览器只会把cookie回传给带有该路径的页面,这样可以避免将
         cookie传给站点中的其他的应用。
         / 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问
            
     domain=None,         Cookie生效的域名
          你可用这个参数来构造一个跨站cookie。
          如, domain=".example.com"
          所构造的cookie对下面这些站点都是可读的:
          www.example.com 、 www2.example.com
      和an.other.sub.domain.example.com 。
          如果该参数设置为 None ,cookie只能由设置它的站点读取。

   secure=False, 如果设置为 True ,浏览器将通过HTTPS来回传cookie。
   httponly=False 只能http协议传输,无法被JavaScript获取
                    不是绝对,底层抓包可以获取到也可以被覆盖)
   ): pass 实现逻辑略

获取cookie:

request.COOKIES  
value = request.COOKIES.get("key") 

删除cookie:

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

3. Django示例学习

项目配置/setting.py

TIME_ZONE = 'Asia/Shanghai'

app01/models.py

from django.db import models
class UserInfo(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    pwd = models.CharField(max_length=32)
    email = models.EmailField()
    tel = models.CharField(max_length=32)

项目配置/urls.py

from django.contrib import admin
from django.urls import path
from app01 import views
urlpatterns = [
    path('login/', views.login),
    path('index/', views.index),
    path('noindex/', views.noindex),
]

app01/views.py

def login(request):
    if request.method == "POST":
        name = request.POST.get("name")
        pwd = request.POST.get("pwd")
        user = UserInfo.objects.filter(name=name,pwd=pwd)

        if user: # 登陆成功
            """在服务器端设置Cookie的相关参数(客户端用js,或者浏览器自带工具)!
               HttpResponse() render() redirect()
               都可以设置Cookie 调用set_cookie方法:
            """
            # 以 HttpResponse为例子进行设置cookie
            response = HttpResponse("登录成功")
            response.set_cookie("username", name) # 创建登录名(cookie的简直随便创建)

            # 删除cookie
            # response.delete_cookie("username", path="/",domain=name)

            # 设置超长时间 相对时间 超过了事件,对应的key value就不存在了!
            # response.set_cookie("is_login",True,max_age=10)

            # 设置超长时间 绝对时间 格林威治时间(当前时间减去8小时)
            # import datetime
            # data = datetime.datetime(year=2018,month=8,day=10,hour=13,minute=5)
            # response.set_cookie("is_login", True, expires=data)

            # 有效路径 设置指定路径
            response.set_cookie("is_login", True, path="/index/")

            # 记录当前登录时间
            # 将settings 里面 TIME_ZONE的值 改成 'Asia/Shanghai'
            import datetime
            now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
            response.set_cookie("login_time", now)

            return response
        else:
            return HttpResponse("登录失败")
    else:
        return render(request,"login.html",locals())


def index(request):
    """
    request.COOKIES 取出请求中的Cookies
    """
    print(request.COOKIES)
    is_login = request.COOKIES.get("is_login")
    username = request.COOKIES.get("username")

    print("username:", username) # username: lingting
    print("is_login:", is_login) # is_login: True

    if is_login:
        """Cookie保存上次登录时间
        并自己写一个是否访问过当前页面的逻辑 last_visit_time
        """
        import datetime
        last_login_time = request.COOKIES.get("login_time")
        last_visit_time = request.COOKIES.get("last_visit_time") # 第一次访问为空
        now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")

        myrender = render(request, "index.html", locals())
        myrender.set_cookie("last_visit_time", now)

        return myrender
    else:
        return redirect("/login/")


def noindex(request):
    """ 色是"""
    username = request.COOKIES.get("username")
    is_login = request.COOKIES.get("is_login")

    print("username", username) # username: lingting
    print("is_login", is_login) # is_login None

    return HttpResponse("OK")

templatetags/login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
        <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</head>
<body>
    <div class="container">
        <div class="row" style="padding: 0 18%;margin-top:50px;">
            <form action="" method="post">
                {% csrf_token %}
              <div class="form-group">
                <label for="user">用户名</label>
                <input type="text" class="form-control" id="user" placeholder="用户名" name="name">
              </div>
              <div class="form-group">
                <label for="Password">密码</label>
                <input type="password" class="form-control" id="Password" placeholder="密码" name="pwd">
              </div>
              <button type="submit" class="btn btn-default">提交</button>
            </form>
        </div>
    </div>
</body>
</html>

templatetags/index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
        <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</head>
<body>
<div class="container">
    <div class="row text-center">
        <h1>hi,{{ username }}</h1>
        <h2>上次登录时间:{{ last_login_time }}</h2>
        <h2>上次访问时间:{{ last_visit_time }}</h2>
        <h2>本次跟新时间:{{ now }}</h2>
    </div>
</div>
</body>
</html>

4. jquery 操作cookie

准备
定义:让网站服务器把少量数据储存到客户端的硬盘或内存,从客户端的硬盘读取数据的一种技术;
下载与引入:jquery.cookie.js基于jquery;先引入jquery,再引入:jquery.cookie.js;下载:http://plugins.jquery.com/cookie/

<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/jquery.cookie.js"></script>

1.添加一个"会话cookie"

$.cookie('the_cookie', 'the_value');

这里没有指明 cookie有效时间,所创建的cookie有效期默认到用户关闭浏览器为止,所以被称为 “会话cookie(session cookie)”。

2.创建一个cookie并设置有效时间为7天

$.cookie('the_cookie', 'the_value', { expires: 7 });

这里指明了cookie有效时间,所创建的cookie被称为“持久 cookie (persistent cookie)”。注意单位是:天;

3.创建一个cookie并设置 cookie的有效路径

$.cookie('the_cookie', 'the_value', { expires: 7, path: '/' });

在默认情况下,只有设置 cookie的网页才能读取该 cookie。如果想让一个页面读取另一个页面设置的cookie,必须设置cookie的路径。cookie的路径用于设置能够读取 cookie的顶级目录。将这个路径设置为网站的根目录,可以让所有网页都能互相读取 cookie (一般不要这样设置,防止出现冲突)。

4.读取cookie

$.cookie('the_cookie');

5.删除cookie

$.cookie('the_cookie', null);   //通过传递null作为cookie的值即可

6.可选参数

$.cookie('the_cookie','the_value',{
    expires:7,
    path:'/',
    domain:'jquery.com',
    secure:true
}) 

参数

expires:(Number|Date)有效期;设置一个整数时,单位是天;也可以设置一个日期对象作为Cookie的过期日期;
path:(String)创建该Cookie的页面路径;
domain:(String)创建该Cookie的页面域名;
secure:(Booblean)如果设为true,那么此Cookie的传输会要求一个安全协议,例如:HTTPS;
posted @ 2018-08-10 23:59  哈哈大圣  阅读(303)  评论(0编辑  收藏  举报