cookie 和 session
程序员文章站
2022-06-15 13:30:24
一、 cookie 1. 定义:保存在浏览器本地上的一组组键值对 2. 特点: 由服务器让浏览器进行设置的 浏览器保存在浏览器本地 下次访问时自动携带 3. 应用: 登录 保存浏览习惯 简单的投票 4. 使用cookie的原因:因为HTTP是无状态的,用cookie来保存状态 5. 在django中 ......
一、 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
上一篇: PHP执行普通shell命令流程解析