zoukankan      html  css  js  c++  java
  • day56 cookie和session和中间件

    day56 cookie和session和中间件

    Cookie和session

    Cookie初识

    Cookie的由来

    大家都知道HTTP协议是无状态的。

    无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不会直接影响后面的请求响应情况。

    一句有意思的话来描述就是人生只如初见,对服务器来说,每次的请求都是全新的。

    状态可以理解为客户端和服务器在某次会话中产生的数据,那无状态的就以为这些数据不会被保留。会话中产生的数据又是我们需要保存的,也就是说要“保持状态”。因此Cookie就是在这样一个场景下诞生。

    并且还有一个问题就是,你登陆我的网站的时候,我没法确定你是不是登陆了,之前我们学的django,虽然写了很多页面,但是用户不用登陆都是可以看所有网页的,只要他知道网址就行,但是我们为了自己的安全机制,我们是不是要做验证啊,访问哪一个网址,都要验证用户的身份,但是还有保证什么呢,用户登陆过之后,还要保证登陆了的用户不需要再重复登陆,就能够访问我网站的其他的网址的页面,对不对,但是http无状态啊,怎么保证这个事情呢?此时就要找cookie了。

    什么是Cookie

    首先来讲,cookie是浏览器的技术,Cookie具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组键值对,可以理解为服务端给客户端的一个小甜点,下次访问服务器时浏览器会自动携带这些键值对,以便服务器提取有用信息。

    Cookie的原理

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

    Http协议特点

    • 无状态,无连接(HTTP 1.1 版本出现了短连接)
    • 格式:请求行 -- 请求头 -- 空行 -- 请求数据

    django 操作cookie

    获取cookie:

    request.COOKIES.get('xx')
    

    获取签名cookie(不常用):

    request.get_signed_cookie('is_login',salt='xxxxxx')
    

    设置cookie:

    HttpResponse('xx').set_cookie('键','值')
    

    设置签名cookie(不常用):

    ret.set_signed_cookie('is_login',True,'xxxxxx')
    

    设置cookie超时时间和过期日期:

    ret.set_cookie('is_login',True,max_age=5) # 超时时间 秒数
    ret.set_cookie('is_login',True,expires=datetime.datetime.now() + datetime.timedelta(days=7))  #过期日期
    

    删除cookie:

    ret.delete_cookie('xxoo')
    

    session的优势

    1. 借助于cookie进行传输
    2. 非明文显示
    3. 长度不限
    4. Django为我们提供了十分方便的session使用接口,只需要简单地几条命令就可以实现session的设置、获取和清空。

    设置session

    request.session['xx'] = 'oo'
    

    设置session的命令包括三个步骤:

    1. 生成随机字符串
    2. 放到cookie中进行传输
    3. 将随机字符串和对应数据保存到自己服务端的数据库中,django-session表

    获取session

    request.session.get('xx') -- 'oo'
    

    这简简单单的一条命令,其实隐含了大约三个获取session的步骤,也就是设置session的逆过程:

    # 1 取出cookie中的session随机字符串{'sessionid':'asdfasfpoaijsdgihsdj'}
    xx = request.COOKIES.get('sessionid')
    # 2 到数据库中查询这个sessionid对应的那条记录
    data = select session_data from django_session where session_key = xx;
    # 3 拿出记录中的session_data数据部分进行解密,并取出数据
    dic = sss(data) -- {'is_login':True}
    dic.get('is_login') -- True
    	
    

    注销session

    @func
    def logout(request):
        request.session.flush()  # 删除session
            return redirect('login')
    

    session.flush()命令是将session注销,主要是两个步骤:

    1. 删除cookie中的sessionid那个键值对
    2. 删除了数据库中的这条记录

    cookie:

    • 保持会话,使用户不需要重复地去登录
    • 有大小限制
    • 有个数限制
    • Cookie总大小上限为4KB
    • 一个服务器最多在客户端浏览器上保存20个Cookie
    • 一个浏览器最多保存300个Cookie,因为一个浏览器可以访问多个服务器

    session:

    • 比cookie面上安全一些
    • session没有大小限制
    • 可以配置多个存储方案,可以配置到缓存中

    中间件

    自定义中间件

    # 第一步,在应用下面创建一个文件夹,名字随便,比如mymiddleware,在这个文件夹下创建 一个py文件,名字随便,比如叫做xx.py
    
    # 第二步:在xx.py文件中定义类,写法如下
    	
        from django.shortcuts import redirect,HttpResponse,render
        from django.utils.deprecation import MiddlewareMixin  #引入django这个类
    
        class Auth(MiddlewareMixin):  #继承这个类
            # 白名单  认证白名单
            white_list = ['/login/',]
    
            def process_request(self,request):  #想对请求进行统一的处理,那么就定义一个process_request方法
            	# 如果方法返回值是None,那就通过了这个方法的认证或者处理,如果返回的值HttpResponse对象,那么请求到这里就结束了,直接返回给了浏览器
                if request.path in self.white_list:
                    pass
                else:
                    is_login = request.session.get('is_login')
                    if is_login == True:
                        pass
                    else:
                        return HttpResponse('滚犊子!!')
    
    # 第三步,settings配置文件中写上这个类的路径
    	
    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
    
        'app01.mymiddleware.xx.Auth',
    ]
    

    process_response方法

    def process_response(self,request,response):
        '''
    
            :param request:
            :param response:  就是视图的返回值(HttpResponse对象)
            :return:
            '''
        # print(response)
        return response
    

    process_view以及执行顺序

    from django.shortcuts import redirect,HttpResponse,render
    
    # 引入django的模块
    from django.utils.deprecation import MiddlewareMixin
    
    
    class MD1(MiddlewareMixin):
    
        def process_request(self,request):
    
            print('MD1--process_request')
    
            return HttpResponse('xxxlpapsjdfoajsdfh')
    
        def process_response(self, request,response):
            print('MD1--process_response')
            return response
    
        def process_view(self, request, view_func, view_args, view_kwargs):
            print('MD1---',view_func.__name__)
    		# view_func就是url对应那个views里面的视图函数,视图函数的参数view_args, view_kwargs
    
    class MD2(MiddlewareMixin):
    
        def process_request(self, request):
            print('MD2--process_request')
    
        def process_response(self, request, response):
            print('MD2--process_response')
            return response
        def process_view(self, request, view_func, view_args, view_kwargs):
            print('MD2---',view_func.__name__)
    
  • 相关阅读:
    某地理位置模拟APP从壳流程分析到破解
    GDB多线程调试分析
    ARM平台指令虚拟化初探
    爱加密企业版静态脱壳机编写
    APK加固之静态脱壳机编写入门
    APK加固之类抽取分析与修复
    Xposed截获 Android手机QQ密码
    菜鸟 学注册机编写之 Android app
    Pstools使用
    msf端口扫描
  • 原文地址:https://www.cnblogs.com/shuoliuchina/p/11953870.html
Copyright © 2011-2022 走看看