09 session 和 token

  • 前端发来的Customer API请求,我们后端代码就直接处理了,并没有验证这个请求是不是已经登录的管理员发出的,客户端未登录,直接访问登录后的主页
  • 对于请求消息的合法性验证,通常有两种方案:session和toke
  • session方案
    • session就是会话的意思,原理如下
    • 服务端在数据库保存一张session表,这张表记录了一次用户登录的相关信息(用户的ID、姓名、登录名之类的),具体记录什么信息,不同的系统各有差异,
    • django中该表的名字就叫django_session
    • session_key:会话ID
    • session_data:会话数据
    • 通过django_session 服务端可以根据session_key找到session_data
    • 用户登录成功后,服务端就在数据库session表中创建一条记录,记录这次会话,也就是创建一个新的session_key插入到该表中,也会放入一些该session对应的数据到session_data中
    • 会在登录请求的HTTP响应头字段Set-Cookie里填入session_key的数据,类似Set-Cookie: sessionid=6qu1cuk8cxvtf4w9rjxeppexh2izy0hh
    • 根据http协议,这个Set-Cookie字段的意思就是要求前端将其中的数据存入cookie中,并且随后访问服务端的时候,在HTTP请求消息中必须带上这些cookie数据
    • cookie通常就是存储在客户端浏览器的一些数据。服务端可以通过http响应消息要求浏览器存储一些数据
    • 以后每次访问同一个网站服务,必须在HTTP请求中再带上这些cookie里面的数据
    • cookie数据由多个键值对组成,比如: sessionid=6qu1cuk8cxvtf4w9rjxeppexh2izy0hh username=byhy favorite=phone_laptop_watch 
    • 该用户的后续操作,触发的HTTP请求,都会在请求头的Cookie字段带上前面说的sessionid,比如 Cookie: sessionid=6qu1cuk8cxvtf4w9rjxeppexh2izy0hh 
    • 服务端接收到该请i去后,只需要到session表中查看是否由该sessionid对应的记录,这样就可以判断这个请求是否是前面已经登录的用户发出的,如果不是,就可以拒绝服务,重定向http请求到登录页面让用户登录
  • 使用session验证客户端请求
    • django对session的支持是缺省就有的
    • 修改mgr/customer.py的dispatch函数
    •   1 # mgr.customer.py
        2 import json
        3 
        4 from django.http import JsonResponse
        5 
        6 from common.models import Customer
        7 
        8 
        9 def mgr_login_required(view_func):
       10     def wrapper(request, *args, **kwargs):
       11         if 'usertype' not in request.session:
       12             return JsonResponse({
       13                 'ret': 302,
       14                 'msg': '未登录',
       15                 'redirect': '/mgr/sign.html'
       16             }, status=302)
       17 
       18         if request.session['usertype'] != 'mgr':
       19             return JsonResponse({
       20                 'ret': 302,
       21                 'msg': '用户非mgr类型',
       22                 'redirect': '/mgr/sign.html'
       23             }, status=302)
       24 
       25         return view_func(request, *args, **kwargs)
       26 
       27     return wrapper
       28 
       29 
       30 @mgr_login_required
       31 def dispatcher(request):
       32     # 将请求参数统一放到request 的params的属性中,方便后续处理
       33 
       34     # GET请求 参数在url中,通过request对象的GET属性获取
       35     if request.method == 'GET':
       36         request.params = request.GET
       37 
       38     # POST/PUT/DELETE 请求参数从request 对象的body属性中获取
       39     # 根据接口,POST/PUT/DELETE 请求的消息体都是 json格式
       40     elif request.method in ['POST', 'PUT', 'DELETE']:
       41         request.params = json.loads(request.body)
       42 
       43     # 根据不同的action分派给不同的函数进行处理
       44     action = request.params['action']
       45     if action == 'list_customer':
       46         return listcustomers(request)
       47     elif action == 'add_customer':
       48         return addcustomer(request)
       49     elif action == 'modify_customer':
       50         return modifycustomer(request)
       51     elif action == 'del_customer':
       52         return deletecustomer(request)
       53 
       54     else:
       55         return JsonResponse({'ret': 1, 'msg': '不支持该类型http请求'})
       56 
       57 
       58 def listcustomers(request):
       59     # 返回一个 QuerySet 对象,包含所有的表记录
       60     qs = Customer.objects.values()
       61 
       62     # 将QuerySet 对象转化为list 类型,否则不能被转化为JSON字符串
       63     retlist = list(qs)
       64 
       65     return JsonResponse({'ret': 0, 'retlist': retlist})
       66 
       67 
       68 def addcustomer(request):
       69     info = request.params['data']
       70     # 从请求消息中,获取要添加客户的信息
       71     # 并且插入到数据库中
       72     # 返回值就是对应插入记录的对象
       73     record = Customer.objects.create(name=info['name'], phonenumber=info['phonenumber'], address=info['address'])
       74 
       75     return JsonResponse({
       76         "ret": 0,
       77         "id": record.id
       78     })
       79 
       80 
       81 def modifycustomer(request):
       82     # 从请求消息中 获取修改客户的信息
       83     # 找到该客户,并且进行修改操作
       84     customerid = request.params['id']
       85     newdata = request.params['newdata']
       86 
       87     try:
       88         # 根据id 从数据库中找到相应的客户记录
       89         customer = Customer.objects.get(id=customerid)
       90     except Customer.DoesNotExist:
       91         return {
       92             'ret': 1,
       93             'msg': f'id为`{customerid}`的客户不存在'
       94         }
       95 
       96     if 'name' in newdata:
       97         customer.name = newdata['name']
       98 
       99     if 'phonenumber' in newdata:
      100         customer.phonenumber = newdata['phonenumber']
      101 
      102     if 'address' in newdata:
      103         customer.address = newdata['address']
      104 
      105     # 注意,一定要执行save才能将修改的信息保存到数据库中
      106     customer.save()
      107 
      108     return JsonResponse({'ret': 0})
      109 
      110 
      111 def deletecustomer(request):
      112     customerid = request.params['id']
      113 
      114     try:
      115         # 根据id 从数据库中找到相应的客户记录
      116         customer = Customer.objects.get(id=customerid)
      117     except Customer.DoesNotExist:
      118         return {
      119             'ret': 1,
      120             'msg': f'id 为`{customerid}` 的客户不存在'
      121         }
      122 
      123     # delete 方法就将该记录从数据库中删除了
      124     customer.delete()
      125     return JsonResponse({'ret': 0})

       

posted @ 2025-12-07 01:02  理想赵雷  阅读(7)  评论(0)    收藏  举报