cookie与session

cookie与session

 

cookie

  以登录功能为例

  原理:

    当用户第一次登陆成功之后 将用户的用户名密码返回给用户浏览器 让用户浏览器保存在本地,之后访问网站的时候浏览器自动将保存在浏览器上的用户名和密码发送给服务端,服务端获取之后自动验证,这样的方式具有非常大的安全隐患

  概述:

    服务端保存在客户端浏览器上的信息都可以称之为cookie, 它的表现形式一般都是k:v键值对(可以有多个)

session

  目的:

    为了解决浏览器数据不安全问题

  原理:

    当用户登陆成功之后,服务端产生一个随机字符串(在服务端保存数据,用kv键值对的形式),交由客户端浏览器保存,之后访问服务端的时候,都带着该随机字符串,服务端去数据库中比对是否有对应的随机字符串从而获取到对应的用户信息

  客户端保存形式

    随机字符串1:用户1相关信息

    随机字符串2:用户2相关信息

    随机字符串3:用户3相关信息

  概述:

    数据是保存在服务端的并且它的表现形式一般也是k:v键值对(可以有多个)

总结

  1、cookie就是保存在客户端浏览器上的信息

  2、session就是保存在服务端上的信息

  3、session是基于cookie工作的(其实大部分的保存用户状态的操作都需要使用到cookie)

cookie操作

  如果你想要操作cookie,你就不得不利用obj对象

# 视图函数的返回值
return HttpResponse()
return render()
return redirect()


obj1 = HttpResponse()
# 操作cookie
return obj1

obj2 = render()
# 操作cookie
return obj2

obj3 = redirect()
# 操作cookie
return obj3
# 如果你想要操作cookie,你就不得不利用obj对象

  设置cookie

obj.set_cookie(key,value)

  获取cookie

request.COOKIES.get(key)

  在设置cookie的时候可以添加一个超时时间

obj.set_cookie('username', 'jason666',max_age=3,expires=3)
    
max_age
expires
    两者都是设置超时时间的 并且都是以秒为单位
    需要注意的是 针对IE浏览器需要使用expires

  删除cookie:

obj.delete_cookie(key)

  主动删除cookie(注销功能)

  代码实现简单登录功能示例

def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == 'jason' and password == '123':

                # 保存用户登陆状态
                obj = redirect('/home/')
            # 让浏览器记录cookie数据
            obj.set_cookie('username', 'jason666')
           
            # 跳转到一个需要用户登陆之后才能看的页面
            return obj
    return render(request,'login.html')



def home(request):
    # 获取cookie信息 判断你有没有
    if request.COOKIES.get('username') == 'jason666':
        return HttpResponse("我是home页面,只有登陆的用户才能进来哟~")
    # # 没有登陆应该跳转到登陆页面
    return redirect('/login/')

  结合装饰器

# 校验用户是否登陆的装饰器
def login_auth(func):
    def inner(request,*args,**kwargs):
        # print(request.path_info)
        # print(request.get_full_path())  # 能够获取到用户上一次想要访问的url
        target_url = request.get_full_path()
        if request.COOKIES.get('username'):
            return func(request,*args,**kwargs)
        else:
            return redirect('/login/?next=%s'%target_url)
    return inner

def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == 'jason' and password == '123':

            # 获取用户上一次想要访问的url
            target_url = request.GET.get('next')  # 这个结果可能是None
            if target_url:
                obj = redirect(target_url)
            else:
                # 保存用户登陆状态
                obj = redirect('/home/')
            # 让浏览器记录cookie数据
            obj.set_cookie('username', 'jason666')
          
            # 跳转到一个需要用户登陆之后才能看的页面
            return obj
    return render(request,'login.html')


@login_auth
def home(request):
    return HttpResponse("我是home页面,只有登陆的用户才能进来哟~")

 session操作

  1、设置session

request.session['key'] = value

  2、获取session

request.session.get('key')

  3、设置过期时间

request.session.set_expiry()

    括号内可以放四种类型的参数

    1、整数    多少秒

    2、日期对象  到指定日期就失效

    3、0      一旦当前浏览器窗口关闭立刻失效

    4、不写    失效时间就取决于django内部全局session默认的失效时间

  4、清除session

request.session.delete()  # 只删服务端的 客户端的不删
request.session.flush()   # 浏览器和服务端都清空(推荐使用)

  5、django默认session的过期时间是14天,但是你也可以人为的修改它

  6、在默认情况下操作session的时候需要django默认的一张django_session表

   7、django_session表中的数据条数

    django_session表中的数据条数是取决于浏览器的,同一个计算机上(IP地址)同一个浏览器只会有一条数据生效。主要是为了节省服务端数据库资源

    注:当session过期的时候可能会出现多条数据对应一个浏览器,但是该现象不会持续很久,内部会自动识别过期的数据清除 你也可以通过代码清除

  8、设置session内部发生的事

request.session['hobby'] = 'read'

    8.1、django内部会自动帮你生成一个随机字符串

    8.2、django内部自动将随机字符串和对应的数据存储到django_session表中

1、先在内存中产生操作数据的缓存
2、在响应经过django中间件的时候才真正的操作数据库

    8.3、将产生的随机字符串返回给客户端浏览器保存

  9、获取session内部发生的事

request.session.get('hobby')

    9.1、自动从浏览器请求中获取sessionid对应的随机字符串

    9.2、拿着该随机字符串去django_session表中查找对应的数据

    9.3、如果比对上了 则将对应的数据取出并以字典的形式封装到request.session中; 如果比对不上 则request.session.get()返回的是None

  10、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,默认修改之后才保存(默认)

 

END

posted @ 2022-03-15 18:57  Snails蜗牛  阅读(26)  评论(0编辑  收藏  举报