Cookie与Session

Cookie与Session

【1】Cookie的发展史

一、诞生背景

​ HTTP的五大特点,而其中之一便是:无状态

HTTP无状态:服务器无法知道两个请求是否来自同一个浏览器,即服务器不知道用户上一次做了什么,每次请求都是完全相互独立。

​ 早期互联网只是用于简单的浏览文档信息、查看黄叶、门户网站等等,并没有交互这个说法。但是随着互联网慢慢发展,宽带、服务器等硬件设施已经得到很大的提升,互联网允许人们可以做更多的事情,所以交互式Web慢慢兴起,而HTTP无状态的特点却严重阻碍其发展!

交互式Web:客户端与服务器可以互动,如用户登录,购买商品,各种论坛等等

​ 不能记录用户上一次做了什么,怎么办?聪明的程序员们就开始思考:怎么样才能记录用户上一次的操作信息呢?于是有人就想到了隐藏域

隐藏域写法:<input type="hidden" name="field_name" value="value">

​ 这样把用户上一次操作记录放在form表单的input中,这样请求时将表单提交不就知道上一次用户的操作,但是这样每次都得创建隐藏域而且得赋值太麻烦,而且容易出错!

ps:隐藏域作用强大,时至今日都有很多人在用它解决各种问题!

​ 网景公司当时一名员工Lou Montulli(卢-蒙特利),在1994年将“cookies”的概念应用于网络通信,用来解决用户网上购物的购物车历史记录,而当时最强大的浏览器正是网景浏览器,在网景浏览器的支持下其他浏览器也渐渐开始支持Cookie,到目前所有浏览器都支持Cookie了。

【2】什么是Cookie

​ Cookie是一种在客户端存储数据的机制,用于在客户端和服务器之间传递和存储数据。它是由服务器发送给客户端的一小段文本信息,存储在客户端的浏览器中。

  • 虽然cookie是服务端告诉客户端浏览器需要保存内容
  • 但是客户端可以选择拒绝保存

【3】Cookie的原理

image-20240312103915667

总结:

​ Cookie的原理是通过在服务器和客户端之间传递和存储数据,实现状态管理和数据交互。服务器发送Cookie给客户端,客户端存储Cookie并在后续请求中发送给服务器,服务器解析和处理Cookie来实现相应的逻辑。

  • ​ 虽然cookie是服务端告诉客户端浏览器想要保存内容
  • ​ 但是客户端浏览器可以选择拒绝保存,如果禁止了,那么,只是想要记录用户状态的网站登陆成功都无法使用了
# 视图函数的返回值
return HttpResponse()
return render()
return redirect()


obj1 = HttpResponse()
# 操作cookie  这是执行cookie的必备操作
return obj1

obj2 = render()
return obj2

obj3 = redirect()
return obj3
  • 设置cookie

obj.set_cookie(key,value)
  • 获取cookie

request.COOKIES.get(key)
  • 设置超时时间

obj.set_cookie(key,value,max_age=5)

【4】Django操作Cookie

  • 虽然cookie是服务端告诉客户端浏览器需要保存内容
  • 但是客户端浏览器可以选择拒绝保存
  • 如果禁止自动保存cookie
  • 那么只要是需要登录的网站都没办法正常登录了
# urls.py
    path('denglu/',views.denglu),
    #
    path('home/',views.home),

# views.py
def denglu(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == 'jingyi' and password =='1212':
            res = redirect('/home/')
            res.set_cookie('username', 'jingyi1212')
            '''
            浏览器不单单会帮你存
            而且后面每次访问你的时候还会带着能看的页面
            '''
            return res
    return render(request,'login1.html')

def home(request):
    if request.COOKIES.get('username') =='jingyi1212':
        return HttpResponse('这个是主页面.vip登陆!!!!')
    return redirect('/denglu/')
<! 前端 >
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="" method="post">
    <p>username:<input type="text" name="username"></p>
    <p>password:<input type="text" name="password"></p>
    <input type="submit">
</form>
</body>
</html>

image-20240312155046973

  • 只要账号密码登陆正确才能切换到主页面

image-20240312155130134

设置一个装饰器:

'''
用户如果在没有登陆的情况下想访问一个需要登陆的页面
那么先跳转到登陆页面,当用户输入正确的用户名和密码之后。
一个跳转到用户之前想要访问的页面去 ,而不是直接写死。
'''
def login_shi(func):
    def inner(request, *args, **kwargs):
        # 获取到用户上一次想要访问的url
        target_url = request.get_full_path()
        # 读取携带的cookie,cookie正确登陆成功
        if request.COOKIES.get('jing') == '1314520':
            return func(request, *args, **kwargs)
        else:
            # 读取携带的cookie,不正确的跳转到登陆页面
            return redirect(f'/denglu/?next={target_url}')
    return inner

def denglu(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == 'jingyi' and password =='1212':
            # 获取用户上一次想要访问的url
            # 结果可能为空 -- 直接访问denglu
            target_url = request.GET.get('target_url')
            if target_url:
                res = redirect(target_url)
            else:
                # 登陆成功之后,保存用户登陆状态
                res = redirect('/home/')
                # max_age = 3 就是设定一个登陆之后的页面停留是的时间
            res.set_cookie('jing', '1314520',max_age=3)
            '''
            浏览器不单单会帮你存
            而且后面每次访问你的时候还会带着能看的页面
            '''
            return res
    return render(request,'login1.html')
@login_shi
def home(request):
    # if request.COOKIES.get('username') =='jinqu123':
    #     return HttpResponse('这个是主页面.vip登陆!!!!')
    # return redirect('/denglu/')
    return HttpResponse('这个是个home页面!!!')

@login_shi
def tian(request):
    # if request.COOKIES.get('username') =='jinqu123':
    #     return HttpResponse('这个是tian页面.vip登陆!!!!')
    # return redirect('/denglu/')
    return HttpResponse('这个是个tian页面!!!')

@login_shi
def fw(request):
    # if request.COOKIES.get('username') =='jinqu123':
    #     return HttpResponse('这个是fw页面.vip登陆!!!!')
    # return redirect('/denglu/')
    return HttpResponse('这个是个fw页面!!!')

【5】Django操作Session

image-20240314164423286

一、session的概念及特点

session概念:在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。说白了session就是一种可以维持服务器端的数据存储技术。session主要有以下的这些特点:

  1. session保存的位置是在服务端
  2. session一般来说要配合cookie使用,如果用户浏览器禁用了cookie,那么只能使用URL重写来实现session的存储功能
  3. 单纯的使用session来存储用户回话信息,那么当用户量较多时,session文件数量会很多,会存在session查询慢的问题

本质上:session技术就是一种基于后端有别于数据库的临时存储技术

  • session数据是保存在服务端的,给客户端返回的是一个随机字符串
  • sessionid:随机字符串
  • session 里面的数据会默认保持在数据库迁移之后的数据库中

【0】session内部所会发生的事情

  • 产生一个随机字符串
  • 表中存储随机字符串与加密数据的对应关系
  • 并将产生的随机字符串也给客户端发送一份并让其保存sessionid:随机字符串
# python manage.py makemigrations  数据库的迁移
# python manage.py migrate  

image-20240313211418905

  • 在默认的情况下session的是时候需要django默认的一张django_session表数据库迁移命令
    • django会自己创建很多表。而django_session就是其中的一张表。
  • 你只要不更新数据里面的数据就会在14天后消失。
  • 当然我们自己也可以人为的修改它。

【1】设置/获取session多个值

  • 给session设置多个值的时候,存在数据库中的数据仍是一条
  • 但是在取session的时候,可以通过request.session对象获取到设置的多组键值对

【2】django_sessoin表中的session数据

  • django_sessoin表中的数据条数取决于浏览器

    • 同一个计算机(IP地址)上同一个浏览器只会有一条数据生效
    • 同一个计算机(IP地址)上多个浏览器会有多个数据生效
    • 当session过期的时候,可能会出现多条数据对应一个浏览器
      • 但是这些数据不会持久化存储,会被定时清理掉,可以手动清除也可以代码清除
  • 目的是为了节省服务器数据库资源.

  • 设置session

request.session['Key'] = value
  • 获取session

request.session.get('key')

【3】设置过期时间

request.session.set_expiry()

【4】清空session

  • request.session.flush(): 该方法会立即删除会话数据,并在下一次请求时创建一个新的会话。
  • request.session.clear(): 该方法会清空当前会话的数据,但会话仍然保持有效,下一次请求仍然可以使用同一会话。

请注意,request.session.delete() 方法实际上是用于删除整个会话对象,而不仅仅是清除会话数据。

以下是修正后的示例:

def clear_session(request):
    request.session.flush()

def clear_session(request):
    request.session.clear()

这样可以正确地清除会话数据。非常抱歉给你带来了困惑,感谢你的指正。

【5】示例

# views.py
def set_session(request):
    request.session['hobby'] = 'music'
	request.session['hobby1'] = 'ball'
    request.session['hobby2'] = 'running'
    return HttpResponse('ms miss 周!!!')


def get_session(request):

    request.session.get('hobby')
    print(request.session.get('hobby'))
    # music
    print(request.session.get('hobby1'))
    # ball
    print(request.session.get('hobby2'))
    # running
    return HttpResponse('你哪都小啊!!')
# urls.py
from django.urls import path
from apply03 import views

urlpatterns = [
    # session
    path('set_session/',views.set_session),
    path('get_session/',views.get_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,默认修改之后才保存(默认)

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值