鉴于自己有时会不太理解cookie和session区别,这里统一做一下整理,有描述不足的地方,请各位指正
背景
http协议中并无用户多次访问之间规则,也就是说,多次访问,身份上都是毫无关联的,服务器是无法得知哪次才是你,故由此产生了cookie和session,浏览器实际确认用户身份是用cookie,而session则是cookie的加密版
cookie
**目的:**让多次访问之间,服务器能够识别出来
**定义:**当用户访问网站时,可以在浏览器端记录一小段内容,每次访问时,在访问数据头部都带上该段cookie内容提交给服务器,这样子服务器便可以根据cookie来判定用户身份
**特性:**cookie对象既可以在浏览器端访问,也可以在服务器端访问,
浏览器端读取 :document.cookie=""
服务器端写入:response.set_cookie(“key”,value)
服务器端读取:request.cookies.get(‘key’)
@app.route("/test_cookie")
def test_cookie():
#从服务器端读取cookie值
username = request.cookies.get("username")
#创建一个response对象
response = make_response("<b>"+str(username)+"</b>")
#服务器端设置cookie值
response.set_cookie("number", "10")
return response
@app.route("/test_cookie2")
def test_cookie2():
# 从服务器端读取cookie值,如果没有则置为0
number = request.cookies.get("number","0")
number = int(number)+1
# 创建一个response对象
response = make_response("<b>number="+str(number)+"</b>")
# 服务器端设置cookie值
response.set_cookie("number", str(number))
return response
session
背景:由于cookie对象可以在浏览器端通过js修改和查看,存在安全隐患,故不能直接通过cookie完成用户识别
session可能隐患:直接将cookie内容加密,如果加密方式暴露,同样有安全问题,将敏感信息存在服务器端,在浏览器端存储一个加密的会话id,如果该id丢失,同样会造成安全问题
from flask import session#1、app.py中导入session
app.secret_key = "123456"#2、设置session秘钥
@app.route("/test_session")
def test_session():
try:
session['number'] += 1
except:
session['number'] = 0
return "number="+str(session['number'])
#浏览器查看cookie中number,发现其前端已经被加密(这里需要自己通过flask或Django对应部署展示的网页才能展示)
#密码加密部分代码
#先进入python命令行
>>> from hashlib import sha1
>>> password = sha1(b"123456")
>>> password
<sha1 HASH object @ 0x000001B199123418>
>>> password.hexdigest()
'7c4a8d09ca3762af61e59520943dc26494f8941b'
#注册加密部分代码
from flask import session
user_app.secret_key = "123456"
#注册页
@user_app.route('/register', methods=['get', 'post'])
def register():
message = None
if request.method == "POST":
if validate_username(request.form['username']):
return render_template("user/register.html", message="用户名重复")
username = request.form['username']
password = request.form['password']
sex = request.form['sex']
age = request.form['age']
print(username, password, sex, age)
#实例化用户
user = User(
username=username,
password=password,
sex=sex,
age=age
)
#密码加密
user.hash_password(password)
db.session.add(user)#将用户添加到会话
db.session.commit()#确认提交
return render_template("user/register.html", message=message)