浅谈cookie 和 session
一、 cookie
定义:保存在浏览器本地上的一组组键值对
特点:
- 由服务器让浏览器进行设置的
- 浏览器保存在浏览器本地
- 下次访问时自动携带
应用:
- 登录
- 保存浏览习惯
- 简单的投票
使用cookie的原因:因为HTTP是无状态的,用cookie来保存状态
在django中操作cookie
设置cookie:
# HttpResponse,render也可以
ret = redirect('/index')
ret.set_cookie('key',value,...) # Set-Cookie:key=value
ret.set_signed_cookie('key',value,salt='加密盐',...)
- 参数:
- key,键
- value='',值
- max_age=None,超出时间
- expires=None,超出时间(针对于IE浏览器)
- path='/',cookie生效的路径,/表示根路径
- domain=None,cookie生效的域名
- secure=False,https传输
- httponly=False,只能http协议传输,无法被JavaScript获取
- 参数:
获取cookie:
request.COOKIES.get('key')
request.get_signed_cookie('key',salt='加密盐',default=RAISE_ERROR,max_age=None)
- 参数:
- default:默认值
- salt:加密盐
- max_age:后台控制过期时间
- 注意:获取时的加密盐要和设置时的加密盐相同,否则无法获取到正确的数据
- 参数:
删除cookie:
def logout(request):
ret = redirect("/login/")
ret.delete_cookie("key") # 删除用户浏览器上之前设置的cookie值
return rep
cookie版登陆校验
from django.shortcuts import render, redirect, HttpResponse
from django.views import View class Login(View):
def get(self, request, *args, **kwargs):
return render(request, 'login.html') def post(self, request, *args, **kwargs):
username = request.POST.get('username')
pwd = request.POST.get('pwd')
if username == 'alex' and pwd == '123':
url = request.GET.get('return_url')
if url:
ret = redirect(url)
else:
ret = redirect('/index/')
# 设置 cookie
# ret['Set-Cookie'] = 'is_login=100; Path=/'
ret.set_cookie('is_login', '1') # 不加密的 Set-Cookie: is_login=1; Path=/
ret.set_signed_cookie('is_login', '1', 's21',max_age=10000,) # 加密的
return ret
return render(request, 'login.html', {'error': '用户名或密码错误'}) # 登录验证装饰器
def login_required(func):
def inner(request, *args, **kwargs):
# 获取 cookie
is_login = request.COOKIES.get('is_login') # 不加密的
is_login = request.get_signed_cookie('is_login', salt='s21', default='') # 加密的
print(is_login)
url = request.path_info
if is_login != '1':
return redirect('/login/?return_url={}'.format(url))
# 已经登录
ret = func(request, *args, **kwargs)
return ret
return inner # 在需要在需要登录才能访问到页面的视图上加装饰器
@login_required
def index(request):
return HttpResponse('首页') @login_required
def home(request):
return HttpResponse('home') def logout(request):
ret = redirect('/login/')
ret.delete_cookie('is_login')
return ret
二、 session
定义:保存在服务器上的一组组键值对(必须依赖cookie来使用)
使用session的原因:
- cookie保存在浏览器本地,不安全
- cookie保存的大小个数受到限制(cookie本身最大支持4096字节)
总结:cookie弥补了HTTP无状态的不足,但是cookie以文本的形式保存在浏览器本地,自身安全性较差,所以我们通过cookie识别不同用户,对应的在session里保存私密信息以及超过4096字节的文本
在django中操作session
- 设置session:
request.session['key'] = value
request.session.setdefault('key',value) # 设置默认值,存在则不设置
- 获取session:
request.session['key']
request.session.get('key',None)
- 删除session:
del request.session['key']
- 其他操作:
# 所有 键、值、键值对
request.session.keys()
request.session.values()
request.session.items() # 会话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失效策略
session版登陆验证
from django.shortcuts import render, redirect, HttpResponse
from django.views import View class Login(View):
def get(self, request, *args, **kwargs):
return render(request, 'login.html') def post(self, request, *args, **kwargs):
username = request.POST.get('username')
pwd = request.POST.get('pwd')
if username == 'alex' and pwd == '123':
url = request.GET.get('return_url')
if url:
ret = redirect(url)
else:
ret = redirect('/index/')
# 设置 session
request.session['is_login'] = 1 # value可以设置为数字
# 设置会话Session和Cookie的超时时间,0表示用户关闭浏览器session就会失效
# request.session.set_expiry(0)
return ret
return render(request, 'login.html', {'error': '用户名或密码错误'}) # 登录验证装饰器
def login_required(func):
def inner(request, *args, **kwargs):
# 获取 session
is_login = request.session.get('is_login')
print(is_login)
url = request.path_info
if is_login != 1:
return redirect('/login/?return_url={}'.format(url))
# 已经登录
ret = func(request, *args, **kwargs)
return ret
return inner # 在需要在需要登录才能访问到页面的视图上加装饰器
@login_required
def index(request):
# request.session.session_key:会话session的key
request.session.clear_expired() # 将失效的数据删除
return HttpResponse('首页') @login_required
def home(request):
return HttpResponse('home') def logout(request):
ret = redirect('/login/')
request.session.delete() # 删除session数据 不删除cookie
request.session.flush() # 删除session数据 并删除cookie
return ret
django中的session配置
- 全局配置:from django.conf import global_settings
1. 数据库Session
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认) 2. 缓存Session
SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎
# 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
SESSION_CACHE_ALIAS = 'default' 3. 文件Session
SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎
# 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()
SESSION_FILE_PATH = None 4. 缓存+数据库
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎 5. 加密Cookie Session
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎 其他公用设置项:
# Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
SESSION_COOKIE_NAME = "sessionid"
# Session的cookie保存的路径(默认)
SESSION_COOKIE_PATH = "/"
# Session的cookie保存的域名(默认)
SESSION_COOKIE_DOMAIN = None
# 是否Https传输cookie(默认)
SESSION_COOKIE_SECURE = False
# 是否Session的cookie只支持http传输(默认)
SESSION_COOKIE_HTTPONLY = True
# Session的cookie失效日期(2周)(默认)
SESSION_COOKIE_AGE = 1209600
# 是否关闭浏览器使得Session过期(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False
# 是否每次请求都保存Session,默认修改之后才保存(默认)
SESSION_SAVE_EVERY_REQUEST = False
浅谈cookie 和 session的更多相关文章
- 浅谈cookie 和session 的区别
具体来说 cookie 是保存在“客户端”的,而session是保存在“服务端”的 cookie 是通过扩展http协议实现的 cookie 主要包括 :名字,值,过期时间,路径和域: 如果cooki ...
- (进阶篇)浅谈COOKIE和SESSION关系和区别
COOKIE介绍 cookie 常用于识别用户.cookie 是服务器留在用户计算机中的小文件.每当相同的计算机通过浏览器请求页面时,它同时会发送 cookie.通过 PHP,您能够创建并取回 coo ...
- 浅谈cookie和session
Cookie简介 Cookie(复数形态Cookies),中文名称为“小型文本文件”,指某些网站为了辨别用户身份或存储用户相关信息而存储在用户本地终端(Client Side) 上的数据(通常为加密数 ...
- 浅谈cookie与session的区别
cookie用的是在客户端保持状态的方案(它是在用户端的会话状态的存贮机制),前端也可以来设置他 所有浏览器都识别,并且会缓存在浏览器中. cookie是以key=value这种键值对的形式保存,每个 ...
- 浅谈cookie、session
揭秘Cookie: cookie说的直白点就是保存在用户浏览器端的一个键值对,举个例子,你现在登录了京东商城,你把浏览器关闭之后,你再打开京东,你还是可以对你的账户继续操作,已经购买的商品,订单都是可 ...
- 浅谈Cookie、Session与Cache的区别
以前实现数据的缓存有多种方法,如客户端的Cookie,服务器端的Session.Application. 一.Cookie Cookie是保存客户端的一组数据,主要用来保存用户的个人信息,主要存放浏览 ...
- 浅谈 cookie 和 session
1.关闭浏览器后,session是否还存在? session在服务器和客户端各保留一个副本,关闭浏览器与否和session是否存在没有任何关系. session采取的是服务器端保持状态的方案,它存储在 ...
- 浅谈Cookie与Session技术
一.什么是状态管理 将客户端与服务器之间多次交互当做一个整体来看,并且将多次交互所涉及的数据(状态)保存下来. 会话:当用户打开浏览器,访问多个WEB资源,然后关闭浏览器的过程,称之为一个会话,选 ...
- 浅谈cookie测试
Cookie 提供了一种在Web 应用程序中存储用户特定信息的方法,例如存储用户的上次 访问时间等信息.假如不进行cookie存储一个网站的用户行为,那么可能会造成以下问题:用户进行购买几件商品转到结 ...
随机推荐
- 【Android】基于A星寻路算法的简单迷宫应用
简介 基于[漫画算法-小灰的算法之旅]上的A星寻路算法,开发的一个Demo.目前实现后退.重新载入.路径提示.地图刷新等功能.没有做太多的性能优化,算是深化对A星寻路算法的理解. 界面预览: 初始化: ...
- 【LeetCode】198. 打家劫舍
打家劫舍 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警. 给定 ...
- Python—文件读写操作
初识文件操作 使用open()函数打开一个文件,获取到文件句柄,然后通过文件句柄就可以进行各种各样的操作了,根据打开文件的方式不同能够执行的操作也会有相应的差异. 打开文件的方式: r, w, a, ...
- Day_04 面向对象
概述 对于面向对象编程的支持,Go语言设计得非常简洁而优雅.因为,Go语言并没有沿袭传统 面向对象编程中的诸多概念,比如继承(不支持继承,尽管匿名字段的内存布局和行为类似继承,但它并不是继承). 虚函 ...
- 深入理解JavaScript中的作用域和上下文
介绍 JavaScript中有一个被称为作用域(Scope)的特性.虽然对于许多新手开发者来说,作用域的概念并不是很容易理解,我会尽我所能用最简单的方式来解释作用域.理解作用域将使你的代码脱颖而出,减 ...
- luoguP1040 加分二叉树
在做各类DP的时候都要思路清晰! #include<cstdio> #include<algorithm> using namespace std; const int N = ...
- 使用DRF来快速实现API调用服务
本帖最后由 范志远 于 2019-3-19 16:55 编辑 增加加载Djagno REST Framework模块的选项 对于settings.py文件的INSTALLED_APPS增加'rest_ ...
- SpringMVC详细流程(一)
Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模 ...
- Django 连接数据库
配置数据库 Django 默认连接的是SQLite,如果想要连接MySQL则需修改配置:在 setting.py 中找到数据库的默认配置: DATABASES = { 'default': { 'EN ...
- Python高级应用程序设计任务期末作业
Python高级应用程序设计任务要求 用Python实现一个面向主题的网络爬虫程序,并完成以下内容:(注:每人一题,主题内容自选,所有设计内容与源代码需提交到博客园平台) 一.主题式网络爬虫设计方案( ...