cookie和session以及token

cookie和seesion以及token 技术都基于状态保持,

​ 有服务器生成, 以 k:v 形式保持在浏览器端,下次请求服务器,附带cookie信息;存在恶意修改可能;可以对cookie进行加码;cookie 是不可跨域的;

cookie只能保存ASCII字符串

使用:

a).会话状态管理(如用户登录状态,购物车,游戏分数或其它需要记录的信息)
b).个性化设置(如用户自定义设置,主题等)
c).浏览器行为跟踪(如跟踪分析用户行为等

Python对cookie操作:

# 获取cookiePython
request.COOKIES['key']
# 设置cookie 
必须使用response
reponse.set_cookie(key,value)

# 删除cookie
必须使用response
respnse.delete_cookie("key")

session:

​ 为了解决cookie存储的安全性,在服务器进行状态保持一种方式,认证登陆用户生成一个sessionID,浏览器一般采用cookie的方式保存;但会增加服务器开销,影响服务器的扩张,跨域资源共享 CORS,CSRF跨站请求伪造

请求过程:

1 第一次访问服务器,会根据用户提交信息,创建对于session,并返回浏览器 ,会将信息存在cookie中,cookie会记录是那个域名的;

2 第二访问服务器是请求会自动查看有此域名有没有cookie信息,存在就发送服务器,服务器端从cookie中获取session。

# 获取、设置、删除Session中数据

request.session['k1']

request.session.get('k1',None)

request.session['k1'] = 123

request.session.setdefault('k1',123) # 存在则不设置

del request.session['k1']

 

 

# 所有 键、值、键值对

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失效策略。
def auth(func):
    ''' 装饰器,检查当前游览器cookies里logname是否存在已登录的帐号,如果存在,则继续执行下面的函数,返回计划进入的url'''
    def inner(request,*args,**kwargs):
        v = request.COOKIES.get('logname')
        if not v:
            return redirect('/')
        return func(request,*args,**kwargs)
    return inner

def login(request):
    '''登录url '''
    if request.method == 'GET':
        return render(request,'login.html')


def index(request):
    if request.method == 'GET':
       '''get模式,获取cookies的logname帐号名,如果为空则返回登录页面 '''
        u = request.COOKIES.get('logname')
        if not u:
            return redirect('/')
        if request.COOKIES['logname'] == 'admin':
            alluser = models.UserName.objects.exclude(uname='admin')
        else:
            # loguser = request.session['username']
            loguser = request.COOKIES['logname']
            alluser = models.UserName.objects.filter(uname=loguser)
        return render(request, 'index.html', {'u_list': alluser})
    if request.method == 'POST':
        '''帐号登录验证 '''
        logname = request.POST.get('logname',None)
        logpwd = request.POST.get('logpwd',None)
        if models.UserName.objects.filter(uname=logname):
            if models.UserName.objects.filter(uname=logname,upwd=logpwd):
                # 登录验证成功,重写cookie的登录帐号,延时10秒
                response = HttpResponse('ok')
                response.set_cookie('logname',logname,max_age=10)
                return response
            else:
                return HttpResponse('pwderr')
        else:
            return HttpResponse('nmerr')

@auth  # 装饰器,在访问url为account时候,验证帐号是否为登录状态
def account(request):
    if request.method == 'GET':
        return render(request,'account.html')
'

[复制代码](javascript:void(0)😉

实例:CBV通过装饰器实现用户登录认证

img

[复制代码](javascript:void(0)😉

from django import views
from django.utils.decorators import method_decorator
@method_decorator(auth,name='dispatch')
class Order(views.View):
    def get(self,request):
        v = request.COOKIES.get('logname')
        return render(request,'index.html',{'current_user':v})

    def post(self,request):
        v = request.COOKIES.get('logname')
        return render(request,'index.html',{'current_user':v})

[复制代码](javascript:void(0)😉

token:

uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,token 的前几位以哈希算法压缩成的一定长度的十六进制字符串)

token 身份验证的过程:

​ 1用户通过用户名和密码发送请求

​ 2服务器程序验证,返回一个签名的token给客户

​ 3 客户端存储token,每次用于发送请求

​ 4 服务器端验证token并返回数据

1 服务器属性必须 ACAO,

posted @ 2023-02-21 12:19  dayu2020  阅读(24)  评论(0编辑  收藏  举报