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

    cookie 和 session

    一、cookie

    1、什么是cookie?

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

    2、cookie的原理?

    cookie的工作原理:它是服务器发送出来存储在浏览器上的一组组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便服务器提取有用信息。

    3、查看cookie

    4、Django 中的cookie操作

    4.1 设置cookie

    obj = HttpResponse()
    return obj
    obj = render()
    return obj
    obj = redirect()
    return obj
    
    # 设置cookie
    obj.set_cookie(key,value)
    obj.set_singed_cookie(key,value,salt='加密盐',max_age = None)
    
    参数:
    
    key, 键
    value='', 值
    max_age=None, 超时时间
    expires=None, 超时时间(IE requires expires, so set it if hasn't been already.)
    path='/', Cookie生效的路径,/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问
    domain=None, Cookie生效的域名
    secure=False, https传输
    httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)
    		
    

    4.2 获取cookie:

    request.COOKIES['key']
    request.COOKIES.get('key')
    

    4.3 删除cookie

    obj.delete_cookie('user')
    

    5、Cookie 版本登录校验

    def login(request):
        if request.method == 'POST':
            username = request.POST.get('name')
            password = request.POST.get('password')
            if username == 'jason' and password == '123'
    			next_url = request.GET.get('next')
                if next_url = next_url != '/logout/':
                    response = redirect(next_url)
                else:
                    response = redirect(class_list)
    			response.set_singned_cookie ('login','yes',salt ='SSS')
                return response
            return render(request,'login.html')
    
    登录装饰器
    def check_login(func):
        @wraps(func):
    	def inner(request,*args,**kwargs):
            next_url = request.get_full_path()
    		if request.get_singed_cookie('login',salt='SSS',default=None) == 'yes':
    			# 已经登录完成
                return func(request,*args,**kwargs)
    		else:
                # 没有用户登录,跳转到刚登录的页面
                return redirect('/login/?next=%s'%next_url)
    	return inner
    

    二、session

    1、session的由来

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

    问题来了,基于HTTP协议的无状态特征,服务器根本就不知道访问者是“谁”。那么上述的Cookie就起到桥接的作用。

    我们可以给每个客户端的Cookie分配一个唯一的id,这样用户在访问时,通过Cookie,服务器就知道来的人是“谁”。然后我们再根据不同的Cookie的id,在服务器上保存一段时间的私密资料,如“账号密码”等等。

    总结而言:Cookie弥补了HTTP无状态的不足,让服务器知道来的人是“谁”;但是Cookie以文本的形式保存在本地,自身安全性较差;所以我们就通过Cookie识别不同的用户,对应的在Session里保存私密的信息以及超过4096字节的文本。

    另外,上述所说的Cookie和Session其实是共通性的东西,不限于语言和框架。

    2、Django中session相关的方法

    2.1 获取、设置、删除Session中的数据
    request.session['k1']
    request.session.get('k1',None)
    request.session['k1'] = 123
    request.session.setdefault('k1',123) # 存在则不设置
    del request.session['k1']
    
    2.2 所有键、值、键值对
    request.session.keys()
    request.session.values()
    request.session.items()
    request.session.iterkeys()
    request.session.itervalues()
    request.session.iteritems()
    # 会话session的key
    request.session.session_key
    
    # 将所有Session失效日期小于当前日期的数据删除
    request.session.clear_expired()
    
    # 检查会话session的key在数据库中是否存在
    request.session.exists("session_key")
    
    # 删除当前会话的所有Session数据
    request.session.delete()
      
    # 删除当前的会话数据并删除会话的Cookie。
    request.session.flush() 
        这用于确保前面的会话数据不可以再次被用户的浏览器访问
        例如,django.contrib.auth.logout() 函数中就会调用它。
    
    # 设置会话Session和Cookie的超时时间
    request.session.set_expiry(value)
        * 如果value是个整数,session会在些秒数后失效。
        * 如果value是个datatime或timedelta,session就会在这个时间后失效。
        * 如果value是0,用户关闭浏览器session就会失效。
        * 如果value是None,session会依赖全局session失效策略。
    
    2.3 session 工作流程

    2.4 Session版本登录验证
    from funtools import wraps
    
    def check_login(func)
    	@wraps(func)
    	def inner(request,*args,**kwargs):
    		next_url = request.get_full_path()
    		if request.session.get('user'):
                return func(request,*args,**kwargs)
    		else:
    			return redirect('/login/?next={}'.format(next_url))
    	return inner
    
    
    def login(request):
    	if request.method == 'POST':
    		user = request.POST.get('user')
            pwd = request.POST.get('pwd')
    		if user == 'jason' and pwd =='1234':
    			# 设置session
                request.session['user']=user
                # 获取跳过登录页面的url
    			next_url = request.GET.get('next')
    			# 如果有,就跳转回登录前的页面
                if next_url:
                    return redirect(next_url)
    			else:
    				# 默认跳回index页面
                    return redirect('/index/')
         return render(request,'login.html')
    
    
    @check_login
    def logout(request):
    	# 删除所有当前的请求相关的session
        request.session.delete()
    	return redirect('/login/')
    
    @check_login
    def index(request):
    	current_user = request.session.get('user',None)
    	return render(request,'index.html',{'user':current_uesr})
    
    
    2.5 Django 中的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,默认修改之后才保存(默认)
    
    
    2.6 CBV中加装饰器相关
    2.6.1 CBV实现的登录视图
    # 写一个登录功能的函数设置session
    def login(request):
        if request.method == 'POST':
            username = request.POST.get('username')
            password = request.POST.get('password')
            if username == 'jason' and password == '123':
                request.session['username'] = 'jason'
                return HttpResponse('ok')
        return render(request, 'login.html')
    
    
    # 写一个装饰器,必须登录才能访问其他页面
    def login_auth(func):
        @wraps(func)
        def inner(request, *args, **kwargs):
            if request.session.get('username'):
                return func(request, *args, **kwargs)
            return redirect('/login/')
    
        return inner
    
    
    
    
    2.6.2 加装饰器的三种方法
    from django.utils.decoration import method_decoration
    
    # @method_decorator(login_auth, name='get')  # 第二种加装饰器的方法。需要用name字段指定给哪个方法加装饰器
    class MyHome(View):
        # 定义get方法
        # @method_decorator(login_auth) # 第一种 加装饰器方法
        @method_decorator(login_auth)
        def dispatch(self, request, *args, **kwargs): # 第三种 加装饰器方法:利用dispacth,get和post都装饰上
            return super().dispatch(request, *args, **kwargs)
    
        def get(self, request):
            return HttpResponse('get')
    
        def post(self, request):
            return HttpResponse('post')
    
    
    
  • 相关阅读:
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
  • 原文地址:https://www.cnblogs.com/king-home/p/11048699.html
Copyright © 2011-2022 走看看