【0】cookie、session和Token的发展史

【1】Cookie的形式
- 存储形式:k:v键值对
- 存储位置:客户端
- 缺点:不安全,信息可能会泄露
【2】session的形式
- 标识符,表示我是当前用户加密出来的数据
- 对敏感信息进行加密处理 
  - 存储服务端
- 标识符配合上你的加密串
 
- 把某个数据的标识符+字符串全给服务端 
  - 客户端存储格式 
    - session_id:返回回来的标识符+加密串
 
 
- 客户端存储格式 
    
【3】Cookie方法
【3.1】设置Cookie
obj = HttpResponse('ok')
obj.set_cookie('K','V')
'''
HttpResponse:django的三板斧,返回的是字符串
.set_cookie('k','v')  -------------  设置cookie  k:key值   v:value值
设置cookie是不只是使用django三板斧中的HttpResponse,其余两个都能使用
'''【3.2】cookie取值
request.COOKIES.get('k')【3.3】设置过期时间
obj.set_cookie('k','v',expires=3)
obj.set_cookie('k','v',max_age=3)
'''
expires:设置超时时间,单位为秒
max_age:设置超时时间,单位为秒
'''【3.4】删除cookie
def logout(request,*args,**kwargs):
    
    obj = redirect('/home/')
    obj.delete_cookie('sign')
    return obj【4】Session
【4.1】session注意事项
- session基于数据库表才能使用 
  - 必须先迁移数据库,生层django_session表
 
- session只对当次登录有效 
  - 主动清除浏览器中本地存在的session
- 验签发现,没有sessionid就会生成新的session
 
- django_session表中的数据取决于浏览器
- 同一个计算机(IP地址)上同一个浏览器只会有一条数据生效
- 同一个计算机(IP地址)上多个浏览器会有多个数据生效
- 当session过期的时候,可能会出现多条数据对应一个浏览器 
  - 但是这些数据不会持久化存储,会被定时清理掉,可以手动清除也可以代码清除
 
- 目的是为了节省服务器数据库资源
【4.2】设置session
request.session['sign'] = 'user'
'''
sign  --------  k值
user  --------  v值
'''【4.3】session取值
sign = request.session.get('sign')【4.4】session设置过期时间
# 设置session
request.session['key'] = 'value'
# 设置过期时间
request.session.set_expiry()
'''
参数:
    1、整数:设置多少秒过期
    2、日期:设置到指定日期失效
    3、0:退出浏览器失效
    4、不写:失效时间取决于Django内部全局session失效的时间
'''
【4.5】清空session
def clear_session(request):
    request.session.delete()
'''
request.session.delete(): 只删除服务端
 
    1、该方法用于删除当前用户的Session数据,但会保留Session的Key
    2、这意味着Session对象本身仍然存在,但其中的数据将被清空
    3、下次访问时,如果Session没有被重新填充,则会得到一个空的Session对象
 
简而言之,就是使用request.session.delete()方法,会删除浏览器端的session,数据库中的数据不会被删除
    
'''def clear_session(request):
    request.session.flush()
'''
request.session.flush():服务端和客户端都删除
 
该方法用于完全删除当前用户的Session,包括Session对象和所有相关数据
下次访问时,将创建一个新的空Session对象
简而言之,就是删除了浏览器端和数据库中的session 
'''【4.6】保存session
1. 数据库Session
SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默认)
2. 缓存Session
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
SESSION_CACHE_ALIAS = 'default'                            # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
3. 文件Session
SESSION_ENGINE = 'django.contrib.sessions.backends.file'    # 引擎
SESSION_FILE_PATH = None                                    # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() 
4. 缓存+数据库
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'        # 引擎
5. 加密Cookie Session
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'   # 引擎
其他公用设置项:
SESSION_COOKIE_NAME = "sessionid"                       # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
SESSION_COOKIE_PATH = "/"                               # Session的cookie保存的路径(默认)
SESSION_COOKIE_DOMAIN = None                             # Session的cookie保存的域名(默认)
SESSION_COOKIE_SECURE = False                            # 是否Https传输cookie(默认)
SESSION_COOKIE_HTTPONLY = True                           # 是否Session的cookie只支持http传输(默认)
SESSION_COOKIE_AGE = 1209600                             # Session的cookie失效日期(2周)(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False                  # 是否关闭浏览器使得Session过期(默认)
SESSION_SAVE_EVERY_REQUEST = False                       # 是否每次请求都保存Session,默认修改之后才保存(默认)【5】CBV加装饰器的三种方法
from django.utils.decorators import method_decorator
# 方式二:放在类视图上面 (放的装饰器函数,name指定你的视图函数里面的方法)
# @method_decorator(login_auth, name='get')
# @method_decorator(login_auth, name='post')
class UserView(View):
    
    # 方式三 : dispactch 方法加装饰器 : 本视图函数内所有的视图都需要走装饰器
    @method_decorator(login_auth)
    def dispatch(self, request, *args, **kwargs):
        # Try to dispatch to the right method; if a method doesn't exist,
        # defer to the error handler. Also defer to the error handler if the
        # request method isn't on the approved list.
        if request.method.lower() in self.http_method_names:
            handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
        else:
            handler = self.http_method_not_allowed
        return handler(request, *args, **kwargs)
    
    # 方式一:加在视图函数上面
    # @method_decorator(login_auth)
    def get(self, request, *args, **kwargs):
        return HttpResponse("这是home页面")【5.1】补充
CSRF Token相关装饰器在CBV只能加到dispatch方法上
或者加在视图类上然后name参数指定为dispatch方法。
备注:
csrf_protect ----------无论settings.py文件中的中间件中的csrf有没有被注释掉都会报错
1、为当前函数强制设置防跨站请求伪造功能
2、即便settings中没有设置中间件
from django.views.decorators.csrf import csrf_exempt, csrf_protect from django.utils.decorators import method_decorator class HomeView(View): @method_decorator(csrf_exempt) def dispatch(self, request, *args, **kwargs): return super(HomeView, self).dispatch(request, *args, **kwargs) def get(self, request): return render(request, "home.html") def post(self, request): print("Home View POST method...") return redirect("/index/")
csrf_exempt ---------- settings.py文件中的中间件中的csrf没有注释掉也不会报错
1、取消当前函数防跨站请求伪造功能
2、即便settings中设置了全局中间件
from django.views.decorators.csrf import csrf_exempt, csrf_protect from django.utils.decorators import method_decorator @method_decorator(csrf_exempt, name='dispatch') class HomeView(View): def dispatch(self, request, *args, **kwargs): return super(HomeView, self).dispatch(request, *args, **kwargs) def get(self, request): return render(request, "home.html") def post(self, request): print("Home View POST method...") return redirect("/index/")




![BUUCTF [HBNIS2018]excel破解 1](https://img-blog.csdnimg.cn/defc313d4da8401ba38023a38b4f12e3.png)














