一、区别:

本人见解:使用自定义数据项进行加密,作为唯一身份识别,登陆时写入cookie(session基于这个)。在显示相关数据

1.cookie

  • 属于客户端会话技术(数据存储在客户端)

  • 默认的Cookie会默认自动携带本网站所有cookie
  • 支持过期时间(就是软件中7天免登录之类的)
  • Cookie跨域名,跨网站

2.session(不做移动端开发,则与token没什么区别)

  • 属于服务端会话技术,数据存储在服务器中(django有个默认的数据表_session)
  • Session默认过期时间是14天
  • 主键是字符串
  • 数据使用了数据安全

3.Token

  • 服务端会话技术
  • 自定义的session(下面会举例说明自定义)
  • 如果在移动端或客户端开发中,通常以json形式传输需要移动端自己存储Token,需要使用关联数据时,主动传递Token

二、实例讲解

2.1 Cookie

  1. #-------Cookie技术
  2. path(r'setcookie/',views.set_cookie,name='set_cookie'),
  3. path(r'getcookie/',views.get_cookie,name='get_cookie'),
  4.  
  5. #----------实现会话用户登录
  6. path(r'login/',views.login,name='login'),
  7. path(r'dologin/',views.do_login,name='do_login'),
  8. path(r'mine/',views.mine,name='mine'),
  9. path(r'logout/',views.logout,name='logout'),
  10.  
  11. 普通不加密:(没有界面。也就是进入该路由则添加CookieRock)
  1. def set_cookie(request):
    response=HttpResponse("设置cookie")
    response.set_cookie('username','Rock')#---------------------Rock为值
    return response
  2.  
  3. def get_cookie(request):
    username=request.COOKIES.get('username')
    return HttpResponse(username)
  4.  
  5. 加密(加盐,有界面获取登录的用户名)
  1. def login(request):
    return render(request,'login.html')
  2.  
  3. def do_login(request):
    uname=request.POST.get('uname')
    response=HttpResponseRedirect(reverse('App_one:mine'))
    response.set_signed_cookie('content',uname,"Rock")#加密(加‘盐’)
    return response
  4.  
  5. def mine(request):
    try:
    uname=request.get_signed_cookie('content',salt="Rock")(得带上‘盐’)
  6.  
  7. if uname:
    return render(request,'mine.html',context={"uname":uname,})
    except Exception as e:
    print("获取失败")
    return redirect(reverse('App_one:login'))
  8.  
  9. def logout(request):
    response=redirect(reverse("App_one:login"))
    response.delete_cookie("content")
    return response
  1.  

2.2 Session

  1. #Session登录退出
  2. path(r'login/',views.login,name='login'),
  3. path(r'mine/',views.mine,name='mine'),
  4. path(r'logout/',views.logout,name='logout'),
  5.  
  1. def login(request):
    if request.method=="GET":
    return render(request,'App2_login.html')
    elif request.method=="POST":
    username=request.POST.get("username")
    request.session["username"]=username
    return HttpResponse("登录成功")
  2.  
  3. def mine(request):
    username=request.session.get("username")
    return render(request,'App2_mine.html',context={"username":username,})
  4.  
  5. def logout(request):
    response=redirect(reverse('App_two:mine'))
    #方式一:删除cookie
    #response.delete_cookie("sessionid")
  6.  
  7. #方式二:删除session
    #del request.session['username']
  8.  
  9. #方式三:全部删除---------删除当前会话,数据库中也会删除(常用)
    request.session.flush()
    return response

2.3 自定义版本的Session---------Token

  1.  
  1. #实战项目token
    #注册
    path(r'register/',views.register,name='register'),
    #登录
    path(r'studentlogin/',views.student_login,name='student_login'),
    #个人中心
    path(r'studentmine/',views.student_mine,name='student_mine'),
  1.  
  2. #项目实战登陆注册Token
  3. def register(request):
  4. if request.method=="GET":
  5. return render(request,"student_register.html")
  6. elif request.method=="POST":
  7. username=request.POST.get("username")
  8.  
  9. passsword=request.POST.get("password")
  10.  
  11. try:
  12. student=Student()
  13.  
  14. student.s_name=username
  15. student.s_password=passsword
  16.  
  17. student.save()
  18. except Exception as e:
  19. return redirect(reverse("App_two:register"))
  20. return HttpResponse("注册成功")
  21.  
  22. #登录
  23. def student_login(request):
  24. if request.method=="GET":
  25. return render(request,'student_login.html')
  26. elif request.method=="POST":
  27. username=request.POST.get("username")
  28. password=request.POST.get("password")
  29.  
  30. students=Student.objects.filter(s_name=username).filter(s_password=password)
  31.  
  32. if students.exists():
  33. #这里有点多余,因为用户名唯一
  34. student=students.first()
  35. ip=request.META.get("REMOTE_ADDR")
  36. token=generate_token(ip,username)
  37. student.s_token=token
  38. student.save()
  39.  
  40. response=HttpResponse("用户登录成功!")
  41. response.set_cookie("s_token",token)
  42. return response
  43. return redirect(reverse("App_two:student_login"))
  44.  
  45. #自定义生成唯一token
  46. def generate_token(ip,username):
  47. c_time=time.ctime()#返回str形式,当前时间
  48. r=username
  49. return hashlib.new("md5",(ip+c_time+r).encode("utf-8")).hexdigest()----------------哈希表(一定要设置编码格式)
  50.  
  51. #个人中心
  52. def student_mine(request):
  53. token=request.COOKIES.get("s_token")
  54. try:
  55. student=Student.objects.get(s_token=token)
  56. except Exception as e:
  57. return redirect(reverse("App_two:student_login"))
  58.  
  59. return HttpResponse(student.s_name)

Django2.2 会话技术cookie session token的区别以及实例介绍的更多相关文章

  1. java ->会话技术Cookie&Session

    会话技术Cookie&Session 会话技术简介 存储客户端的状态 由一个问题引出今天的内容,例如网站的购物系统,用户将购买的商品信息存储到哪里?因为Http协议是无状态的,也就是说每个客户 ...

  2. Web核心之会话技术Cookie&Session

    什么是会话技术? http协议是无状态协议.为了满足在多次请求之间数据进行交互,推出了会话技术. 会话概念:一次会话,指的是从客户端和服务器建立起连接开始,到客户端或服务器断开连接为止.中间可能进行多 ...

  3. JavaWeb学习笔记五 会话技术Cookie&Session

    什么是会话技术? 例如网站的购物系统,用户将购买的商品信息存储到哪里?因为Http协议是无状态的,也就是说每个客户访问服务器端资源时,服务器并不知道该客户端是谁,所以需要会话技术识别客户端的状态.会话 ...

  4. JavaEE之会话技术Cookie&Session

    会话技术简介 存储客户端的状态 由一个问题引出今天的内容,例如网站的购物系统,用户将购买的商品信息存储到哪         里?因为Http协议是无状态的,也就是说每个客户访问服务器端资源时,服务器并 ...

  5. 会话技术Cookie&Session

    1.会话技术概述 从打开浏览器访问某个站点,到关闭这个浏览器的整个过程,称为一次会话.会话技术用于记录本次会话中客户端的状态与数据. 会话技术分为Cookie和Session: Cookie:数据存储 ...

  6. 03012_会话技术Cookie&Session

    1.会话技术简介 (1)存储客户端的技术 网站的购物系统,用户将购买的商品信息存储到哪里?因为Http协议是无状态的,也就是说每个客户访问服务器端资源时,服务器并不知道该客户端是谁,所以需要会话技术识 ...

  7. 会话技术 Cookie+Session

    会话:这种在多次HTTP连接间维护用户与同一用户发出的不同请求之间关联的情况称为维护一个会话(session) 一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开: 功能:在一次会话 ...

  8. Servlet 会话技术cookie和session

    会话技术 Cookie技术:会话数据保存在浏览器客户端. Session技术:会话数据保存在服务器端. 一.Cooke技术 1. 特点 Cookie技术:会话数据保存在浏览器客户端. 2 .Cooki ...

  9. 会话技术cookie与session

    目录 会话技术cookie 会话技术 cookie 服务器怎样把Cookie写 给客户端 服务器如何获取客户端携带的cookie session session简介 Session如何办到在一个ser ...

随机推荐

  1. Python之threading模块的使用

    作用:同一个进程空间并发运行多个操作,专业术语简称为:[多线程] 1.任务函数不带参数多线程 #!/usr/bin/env python # -*- coding: utf-8 -*- import ...

  2. MySecurity(安全类)

    /// <summary> /// MySecurity(安全类) 的摘要说明. /// </summary> public class MySecurity { /// &l ...

  3. BZOJ 4522: [Cqoi2016]密钥破解 exgcd+Pollard-Rho

    挺简单的,正好能再复习一遍 $exgcd$~ 按照题意一遍一遍模拟即可,注意一下 $pollard-rho$ 中的细节. #include <ctime> #include <cma ...

  4. python学习用到的网站

    官方地址:https://www.python.org/ 玩蛇网:http://www.iplaypython.com/

  5. java 强制类项转换

    origin:http://blog.csdn.net/hikvision_java_gyh/article/details/8957450 编写java程序时,引用变量只能调用它编译时的类项方法.而 ...

  6. 斐波那契数列的通项公式x+洛谷P2626x

    #include<cstdio> #include<iostream> #include<cmath> using namespace std; int main( ...

  7. codevs 3022 西天收费站 x

                         题目描述 Description 唐僧师徒四人终于发现西天就在眼前,但猴子突然发现前面有n个收费站(如来佛太可恶),在每个收费站用不同的方式要交的钱不同,输入 ...

  8. 顺序表应用6:有序顺序表查询(SDUT 3330)

    Problem Description 顺序表内按照由小到大的次序存放着n个互不相同的整数,任意输入一个整数,判断该整数在顺序表中是否存在.如果在顺序表中存在该整数,输出其在表中的序号:否则输出&qu ...

  9. 第06课:作用域、JS预解析机制

    从字面上理解----域就是空间.范围.区域,作用就是读.写,所以作用域我们可以简单理解为:在什么样空间或者范围内对数据进行什么样的读或写操作. 看一下代码 alert(a); // 为什么是undef ...

  10. FastAdmin 在 CRUD 时出现 exec() has been disabled for security reasons 处理方法

    然后在看看 禁用函数列表(php.ini)disable_functions = proc_open, popen, exec, system, shell_exec, passthru 这里要把 e ...