zoukankan      html  css  js  c++  java
  • cookie与 session

    一、cookie and session

    HTTP协议是无状态的 也就是说 你每一次访问浏览器的话 浏览器是不认识你的 每一次访问都是独立的 ,浏览器是‘你虐他千百遍’ 转眼之间"他待你如初恋",他是不会受到前面请求响应情况直接影响,也不会直接影响后面的请求响应的情况,每一次请求都是全新的,对于状态这一词可以理解为 客户端和服务端在某次回话中产生的数据,那么无状态就是这些数据不会保存。但是有些会话的数据我们又是需要保存的,也就是要 "保持状态",因此Cookie就是这样诞生的

    cookie具体指的就是一段小信息,他是服务器发出来储存在浏览器上的一组组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便于服务器提取有用的信息

    其工作原理:有服务器产生内容,浏览器收到请求后保存在本地:当浏览器再次访问时,浏览器会自动带上Cookie,这样子服务器可以通过cookie中的内容来判断这是 "谁"

    设置cookie

    obj = HttpResponse()
    
    obj.set_cookie()
    
    
    

    获取cookie

    #第一种
    request.COOKIES['key']    #不推荐使用
    #第二章
    request.COOKIE.get()
    

    删除cookie

    def logout(request):
        rep = rediect('/login/')
        rep.delete_cookie('user')
        return rep
    

    cookie版 登陆校验

    from functools import wraps
    def check_login(func):
        @wraps(func)
        def inner(request,*args,**kwargs):
    
            if request.COOKIES.get('username'):
                return func(request,*args,**kwargs)
            else:
                next_url = request.path_info
                return redirect('/login/?next=%s'%next_url)
        return inner
    
    
    def login(request):
        if request.method == "GET":
            return render(request,'login.html')
        if request.method== "POST":
            username = request.POST.get('username')
            password = request.POST.get('password')
            if username =='luodaoqi' and password =='123':
                old_path = request.GET.get('next') 
                if old_path:
                    obj = redirect(old_path)
                else:
                    obj = redirect('/index/')
                obj.set_cookie('username','password')
                return obj
        return render(request,'login.html')
    

    二、session

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

    这就是session

    获取session

    #第一种
    request.session['key']
    #第二种
    request.session.get('key',None)
    '''
    1.django内部自动生成了随机的字符串
    2.在django_session表中存入数据
    session_key          session_data         date
    随机字符串1              数据1            ...
    随机字符串2              数据2            ...
    随机字符串3              数据3            ...
    3.将产生的随机字符串发送给浏览器 让浏览器保存到cookie中
    sessionid:随机字符串
    	
    
    '''
    

    设置session

    request.session['key']=xxx
    request.session.setdefault('key',xxx)#存在就不设置
    
    '''
    1.浏览器发送cookie到django后段之后 django会自动获取到cookie值
    2.拿着随机字符串去django session表中比对 是否有对应的数据
    3.如果比对上了 就讲随机字符串所对应的数据 去除赋值给request.session
    	如果比对不上 那么request.session就是 空
    '''
    #django session表对于同一个浏览器只会有一条记录  不同的有多个记录
    

    删除session

    request.session.delete() #只会删除服务端的session
    request.session.flush() #浏览器 和服务端的全部删除
    

    设置session 超时时间

    request.session.set_expiry(value多种配置)
    数字
    0
    不写
    时间格式
    

    Django中间件(*****)

    ​ 用户访问频率限制

    ​ 用户是否黑名单 白名单

    ​ 所有用户登陆校验

    ​ 只要涉及到网址全局的功能 你就应该考虑使用中间件

    django中间件暴露呗程序员五个可以自定义的方法(五个方法都是在特定条件下触发的)

    1. 新建一个文件夹 里面新建一个任意名称的PY文件

      里面写类 固定继承

      from django.utils.deprecation import MiddlewareMixin
      class MyMiddle(MiddlewareMixin):

      2.去配置文件注册到中间件配置中
      你需要手写字符串的路径
      'app01.mymiddleware.myaabb.MyMiddle1'

    跨站请求伪造(csrf) 钓鱼网站
    就类似于你搭建了一个跟银行一模一样的web页面
    用户在你的网站转账的时候输入用户名 密码 对方账户
    银行里面的钱确实少了 但是发现收款人变了

        最简单的原理
            你写的form表单中 用户的用户名  密码都会真实的提交给银行后台
            但是收款人的账户却不是用户填的 你暴露给用户的是一个没有name属性的input框
            你自己提前写好了一个隐藏的带有name和value的input框
    

    解决钓鱼网站的策略
        只要是用户想要提交post请求的页面 我在返回给用户的时候就提前设置好一个随机字符串
        当用户提交post请求的时候  我会自动先取查找是否有该随机字符串 
        如果有 正常提交
        如果没有  直接报403 
    
     form表单
            你在写的时候只需要加上一个
            {% csrf_token %}
    

        ajax
            第一种  自己再页面上先通过{% csrf_token %}获取到随机字符串  然后利用标签查找 
            data:{'username':'jason','csrfmiddlewaretoken':$('[name="csrfmiddlewaretoken"]').val()},
            第二种
            data:{'username':'jason','csrfmiddlewaretoken':'{{ csrf_token }}'},
            第三种
            拷贝js文件
    


    装饰器
        csrf_exempt  只有两种装饰的方式
        from django.views.decorators.csrf import csrf_exempt, csrf_protect
        from django.utils.decorators import method_decorator
        # 第一种
        # @method_decorator(csrf_exempt,name='dispatch')
        class MyCsrf(View):
            # 第二种
            @method_decorator(csrf_exempt)
            def dispatch(self, request, *args, **kwargs):
                return super().dispatch(request,*args,**kwargs)
            def get(self,request):
                return HttpResponse('hahaha')
                
        除了csrf_exempt之外 所有的其他装饰器 在CBV上面都有三种方式
        @method_decorator(csrf_protect,name='post')
        class MyCsrf(View):
            @method_decorator(csrf_protect)
            def dispatch(self, request, *args, **kwargs):
                return super().dispatch(request,*args,**kwargs)
            def get(self,request):
                return HttpResponse('hahaha')
    
            @method_decorator(csrf_protect)
            def post(self,request):
                return HttpResponse('post')
    
  • 相关阅读:
    RabbitMQ消息队列———安装(一)
    Tornado之自定义异步非阻塞的服务器和客户端
    爬虫之解析微信的网页版(分析后台,不分析前端)
    阻塞I/O、非阻塞I/O和I/O多路复用
    Git之安装管理
    MongoDB下载以及安装
    Python3学习笔记(十六):随机数模块random
    Python3学习笔记(十五):常用时间模块time和datetime
    Python3学习笔记(十四):可迭代对象、迭代器和生成器
    unittest详解(七) 自动生成测试报告
  • 原文地址:https://www.cnblogs.com/luodaoqi/p/11768251.html
Copyright © 2011-2022 走看看