博客园 首页 私信博主 显示目录 隐藏目录 管理 动画

cookie和session

一,什么是cookie

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

二,Cookie的工作原理

  cookie是由服务器产生的内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上cookie,这样服务器就能通过cookie的内容来判断这个是‘谁’了。

三,django中操作cookie

  登陆后,浏览器中添加cookie:

def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == 'jason' and password == '123':
            old_path = request.GET.get('next')
            if old_path:
                obj = redirect(old_path)
            else:
                obj = redirect('/home/')
            # 用户登录成功 朝浏览器设置一个cookie
            obj.set_cookie('name','jason',expires=7*24*3600) # expires:保存cookie的时间,单位是秒
            return obj
    return render(request,'login.html')

  制作登陆校验装饰器:

from functools import wraps
def login_auth(func):
    @wraps(func)
    def inner(request,*args,**kwargs):
        # 校验cookie
        # print(request.get_full_path())
        # 拿到需要登陆校验的路径
        old_path = request.get_full_path()
        if request.COOKIES.get('name'):
            return func(request,*args,**kwargs)
        return redirect('/login/?next=%s'%old_path)
    return inner

  删除cookie:

def logout(request):
    rep = redirect("/login/")
    rep.delete_cookie("user")  # 删除用户浏览器上之前设置的usercookie值
    return rep

四,什么是session:

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

  案例:

  登陆后添加session:

def login(request):
    if request.method == "POST":
        user = request.POST.get("user")
        pwd = request.POST.get("pwd")

        if user == "alex" and pwd == "alex1234":
            # 设置session
            request.session["user"] = user
            # 获取跳到登陆页面之前的URL
            next_url = request.GET.get("next")
            # 如果有,就跳转回登陆之前的URL
            if next_url:
                return redirect(next_url)
            # 否则默认跳转到index页面
            else:
                return redirect("/index/")
    return render(request, "login.html")

  制作校验登陆状态的装饰器:

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=%s"%next_url)
    return inner

  设置session:request.session['name'] = 'jason'

    1:先生成了一个随机的字符串

    2:在django session表中存储该随机字符串与数据的记录

    3:将随机的字符串发送个客户端浏览器

  获取session:request.session.get('name')

    1:django自动获取浏览器中随机字符串取django session表里面的进行对比

    2:如果比对成功 会将当前随机字符串对应的数据赋值给request.session

    3:通过requset.session操作该数据(数据不存在也不会影响我们的业务逻辑)

  删除当前会话的所有session数据

    requset.session.delete()

  删除当前的会话数据并删除会话的cookie

    request.session.flush() :(用于确保前面的会话数据不可以再次被用户的浏览器访问)

  设置会话session和cookie的超出时间

    request.session.set_expiry(value)

      如果value是个整数.session会在数秒之后失效。

      如果value是个datatime或timedelta,session就会在这个时间后失效。

      如果value是0,用户关闭浏览器session就会失效。

      如果value是None,session会依赖全局session失效策略。

  django默认的session存活时间是两周(14天)

      

        

 

posted @ 2019-06-17 20:50  monsterc4t  阅读(157)  评论(0编辑  收藏  举报

消失在风中的少年 -mashiro