首页 > 其他分享 >cookie与session

cookie与session

时间:2023-05-06 15:47:17浏览次数:40  
标签:return Session request django session cookie

目录

一、cookie与session简介

知识点回顾

回忆:HTTP协议四大特性
1.基于请求响应
2.基于TCP、IP作用于应用层之上的协议
3.无状态
不保存客户端的状态
4.无连接

需求变化分析

最开始的网站都不需要用户注册 所有人来访问获取到的数据都是一样的
随着互联网的发展很多网站需要指定当前用户的状态,因此需要用到cookie和session

cookie

保存在客户端,存储与用户状态相关的信息

session

保存在服务端,存储与用户状态相关的信息

ps:session的工作需要依赖于cookie

补充:浏览器有资格拒绝保存服务端发送过来的cookie数据(需要在设置里设置,但都拒绝的话会出现不能登陆的情况)

我们可以在浏览器中右键检查查看cookies信息,如果我们主动删除这些cookies信息就需要重新登陆,如果短时间频繁操作,可能被某些网页检测到会封你ip(有人上课演示被封了,我也不知道是谁).

image

二、django操作cookie

要想操作cookie就不能直接返回HttpResponse对象 必须先用变量接收,因为我们如果要操作cookie就需要对三板斧产生的对象进行操作

obj1 = render()
return obj1
obj2 = HttpResponse()
return obj2
obj3 = redirect()
return obj3

首先实现一个本地Cookie的简单操作 通过后端传给Cookie 随时随地可以调用

views
def set_cookie(request):
    obj = HttpResponse('Happy Happy !!!')
    obj.set_cookie('name', 'James')
    return obj	

image

这里我们可以看到set_cookie方法把内部的数据发送到前端转换成了cookie.

同时我们可以在后端用request.COOKIES获取cookie信息

再来写一个登录账号跳转页面的情况吧!
这里的装饰器是用于判断cookie所代表的信息是否正确
def login_func(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == 'jason' and password == '123':
            target_path = request.GET.get('next')
            if target_path:
                obj = redirect(target_path)
            else:
                obj = redirect('/home/')
            obj.set_cookie('name', username)
            return obj
    return render(request, 'loginPage.html')


def login_auth(func_name):
    def inner(request, *args, **kwargs):
        # print(request.path)  # 只获取用户输入的路由信息
        # print(request.path_info)  # 只获取用户输入的路由信息
        target_path = request.path_info
        # print(request.get_full_path())  # 获取用户输入的路由信息+问号后面携带的数据
        if request.COOKIES.get('name'):
            res = func_name(request, *args, **kwargs)
            return res
        return redirect('/login/?next=%s' % target_path)

    return inner


@login_auth
def home_func(request):
    return HttpResponse('home页面 只有登录的用户才可以查看')


@login_auth
def home1_func(request):
    return HttpResponse('home1页面 只有登录的用户才可以查看')


@login_auth
def home2_func(request):
    return HttpResponse('home2页面 只有登录的用户才可以查看')

在上面的代码中我们又联系实际情况,想到了一个问题,做的好一些的网站,通常都是会 记住我们之前访问的网页,在进行登陆有继续访问该网页.这里就需要用到一些小知识点了.也就是我们需要在装饰器中修改跳转的内容让他记住我们之前想要访问的网址.

def login_auth(func_name):
    def inner(request, *args, **kwargs):
        # print(request.path)  # 只获取用户输入的路由信息
        # print(request.path_info)  # 只获取用户输入的路由信息
        target_path = request.path_info
        # print(request.get_full_path())  # 获取用户输入的路由信息+问号后面携带的数据
        if request.COOKIES.get('name'):
            res = func_name(request, *args, **kwargs)
            return res
        return redirect('/login/?next=%s' % target_path)

    return inner

三、django操作session

由于session是保存在服务端上面的数据 就应该有个地方能够存储
我们只需要执行数据库迁移命令即可 django会自动创建很多需要的表

ps:django默认的session失效时间是14天

设置session的代码:

request.session['key'] = value

当我们在设置session的时候会执行下列操作:

  • 1.生成一个随机字符串
  • 2.对value数据做加密处理 并在django_session表中存储
    随机字符串>>>加密数据
  • 3.将随机字符串也发送一份给客户端保存(cookie)
    sessionid:随机字符串

获取session的代码

request.session.get('key')

在获取session的时候会执行下列操作

  • 1.自动获取随机字符串
  • 2.去django_session表中根据随机字符串获取加密的数据
  • 3.自动解密数据并处理到request.sesion.get()中

总结和补充

总结

通过上面的知识点讲解我们可以发现session的使用非常简单,但是在底层来看,其实代码执行了非常多的操作,今后我们写代码也应该朝这方面靠拢.

补充说明

当我们在执行代码进行实操的时候会遇到一些问题

设置session中的注意事项

def set_session(request):
    request.session['name'] = 'Like'  		# 设置Session
    return HttpResponse('设置Session')
'''
		    第一次运行的时候访问接口会发生报错    no such table: django_session
		    因为当客户端登录成功之后 服务端会产生一个随机字符串 返回客户端去保存(之所以要保存就是因为我们只有保存了这个字符串对应的信息,才能去进行信息校对,否则前端发送cookie我们无法识别)
		    服务端会针对这些字符串跟对应用户信息做一个保存 这个关系就保存在服务端执行迁移命令里面的Django_session表里面(但是目前我们第一次跑程序还没执行迁移命令)
		    表里面有三个字段 Session_key  Session_data Expire_date
		    session_ky    随机产生的一个加密字符串令牌
		    session_data  session数据
		    expire——date  django默认的session失效时间14天(不登录)

		    这个时候迁移命令创建完之后就可以访问接口了
	    '''

迁移操作截图

image

获取session中的注意事项


def get_session(request):                 # 获取session
    print(request.session.get('name'))
    return HttpResponse('获取Session')    # 自动会加密解密

'''
		    request.session['name'] = 'Like'
		        1.django自动产生一个随机字符串返回给客户端(对name加密)
		        2.往django_session创建数据(对jason加密)
		    request.session.get('name')
		        1.自动从请求中获取sessionid对应的随机字符串
		        2.拿着随机字符串去django_session中匹配数据
		        3.如果匹配上还会自动解密数据并展示
		    '''

其他注意事项

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其他操作
'''
			删除当前会话的所有Session数据
		    request.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失效策略。
		    '''


标签:return,Session,request,django,session,cookie
From: https://www.cnblogs.com/zhihuanzzh/p/17377562.html

相关文章

  • Struts2----中使用ValueStack、ActionContext、ServletContext、request、session等
     声明:本文参考Struts2版本为2.3.1.2,内容仅供参考,限于笔者水平有限,难免有所疏漏,望您能友善指出。本文发表于ITEYE,谢绝转载。1.ValueStack  ValueStack在中文版的《Struts2深入浅出》一书中译作“值栈”。其本身数据结构是一个栈,使用者可以把一些对象(又称作bean)存入值栈中,然后......
  • Redis--分布式中实现Session共享(一)
    上一篇介绍了如何使用nginx+iis部署一个简单的分布式系统,文章结尾留下了几个问题,其中一个是"如何解决多站点下Session共享"。这篇文章将会介绍如何使用Redis,下一篇在此基础上实现Session。这里特别说明一下,其实没有必要使用Redis来解决Session共享。Asp.net提供了StateServer模......
  • 分页器,cookie,session
    推导分页的原理(你只需要明白原理即可,代码不需掌握)#分页:当数据量过多的时候,一页展示不完,我们分好多页来展示几个参数:1.当前第几页2.总数据量有多少(从数据库中查询出来)3.每页展示20条(自己规定的)4.总数据量/每页展示的条数=总页数#把数据每页展示10条展示多少......
  • JDK导致ActiveMQ、Kafka连接zookeeper失败:Session 0x0 for server 10.1.21.244/<unres
      最近在部署一套ActiveMQ集群时,使用zookeeper来实现,zookeeper启动了,在启动ActiveMQ时,抛出异常:    WARN|Session0x0forserver10.1.21.244/<unresolved>:2181,unexpectederror,closingsocketconnectionandattemptingreconnectjava.lang.IllegalArgu......
  • SqlSessionFactory、SqlSession、Druid之间的关系梳理
    SqlSessionFactory是什么?SqlSessionFactory 是Mybatis的核心接口之一,它是用于创建SqlSession对象。Mybatis的SqlSession对象是负责管理应用程序与数据库之间一组事务的机制,并为应用程序提供访问数据库的方法。SqlSession是线程不安全的对象,因此应始终使用它的请求/响......
  • 【HMS Core】获取用户信息接口,返回 session timeout
    【问题描述】集成华为账号服务,获取用户信息,调用相关接口一直返回sessiontimeout,参考链接:https://developer.huawei.com/consumer/cn/doc/development/HMSCore-References/get-user-info-0000001060261938​ 【解决方案】1、如果是走的端测的比如OkHttpClient这种方式的是需......
  • 手拿把掐session、token、cookie
    发展以前的web很单一,就是用来浏览文档,服务器也不需要记住谁在某个时间段浏览了什么文档,每一次请求都是一个新的http协议,就是请求加响应,不需要记住是谁发了http请求。随着交互式web的兴起,比如需要登录的网站、在线购物等等,就面临了一个问题,就是要管理会话,必须要记住哪些人登录系......
  • 彻底理解 cookie、session、token
    发展史1、很久很久以前,Web基本上就是文档的浏览而已,既然是浏览,作为服务器,不需要记录谁在某一段时间里都浏览了什么文档,每次请求都是一个新的HTTP协议,就是请求加响应,尤其是我不用记住是谁刚刚发了HTTP请求,每个请求对我来说都是全新的。这段时间很嗨皮。2、但是随着交互式We......
  • Handling Information Loss of Graph Neural Networks for Session-based Recommendat
    目录概符号说明存在的问题LossysessionencodingproblemIneffectivelong-rangedependencycapturingproblemLESSRS2MGS2SG模型EOPA(Edge-OrderPreservingAggregation)SGAT(ShortcutGraphAttention)叠加代码ChenT.andWongR.C.Handlinginformationlossofgrap......
  • B/S 结构系统的 缓存机制(Cookie) 以及基于 cookie 机制实现 oa 十天免登录的功能
    B/S结构系统的缓存机制(Cookie)以及基于cookie机制实现oa十天免登录的功能@目录B/S结构系统的缓存机制(Cookie)以及基于cookie机制实现oa十天免登录的功能每博一文案1.Cookie的概述2.session与Cookie之间的联系:3.Cookie的作用:4.Cookie的生成机理的原理:5......