当我们登录一个网站的时候,发生了什么?
下面有几个问题,可以帮我们更好的理解这个问题。在登录一个网站的时候,点击登录的按钮之后,发生了什么:
1.1 浏览器如何把输入的账号和密码发送到服务器?
1.2 登录的时候发送的http请求是什么样的方法?get or post ?
1.3 这个http请求要发送给server哪里?
1.4 server收到http请求之后,如何拿到用户名和密码?
1.5 server拿到用户名和密码,如果在数据库查找?
1.6 第一次登录之后,如何实现下一次不需要登录,直接进入主界面?
1.7 cookie和session的原理
1.8 结合下面的这个flask的例子,分析一下cookie + session 实现不需要登录,直接进入主页面
结合下面的flask实现的登录+session 的例子来分析
代码如下:
"""
python3 + flask
"""
from flask import Flask
from flask import request, session
app = Flask(__name__)
@app.route('/login', methods=['POST', 'GET'])
def login():
# 如果是一个post请求
if request.method == 'POST':
if request.form['username'] == 'admin' or request.form['password'] == '123':
session['username'] = request.form['username']
return 'Admin login successfully!'
else:
return 'No such user!'
# 如果是一个get请求
print ("--test-- :",session)
if 'username' in session:
#如果创建过session,也就是说sesson里面会username的key,那么表示这个已经登录过
return 'Hello %s!' % session['username']
# 如果没有登录
else:
title = request.args.get('title', 'Default')
return '''
<form action = "/login" method = "post">
<p><input name="username"> </p>
<p><input name="password"> </p>
<p><button type="submit"> sign in </button> </p>
</form>
'''
app.secret_key = '123456'
if __name__ == '__main__':
# 在浏览器里面输入 http://127.0.0.1:5555/login
app.run(debug=True,port=5555)
分析
从浏览器的角度来看:
image.png image.png
当我们输入url的时候(注意,这里是第一次访问,如果之前访问过,就在浏览器里面清除一下访问记录 or 进入 隐身模式),浏览器发送http请求的header
image.png
服务器给出的相应
image.png
当写好账号和密码,点击登录的时候:
image.png
这时候浏览器发送的http请求是:
image.png
服务器的相应是(故意写错了账号和密码):
image.png
相应的页面是:
image.png
如果输入正确的账号和密码,如下图说是,那么会发生什么?
image.png
浏览器发送的http请求是这样:
image.png服务器的响应是,如下图,注意http相应里面多了一个set-cookie的字段
服务器相应的页面如下图说是,现在已经表示登录成功。
image.png
那么,下次在访问的时候,因为已经登录过了,所以浏览器在发送http请求的时候,在里面加上一个cookie的字段,字段的value是上一次服务器给的。通过这个cookie,可以实现不需要登录直接进入主页面的feature。服务器收到http的请求之后,通过cookie,作为session的唯一标示,来访问sever上面session的值,这个值作为判断用户是否登录的标志。
在代码里面,是这样的:
# 如果已经登录,用户名存在session里面
if 'user' in session:
return 'Hello %s!' % session['user']
再一次访问的时候,直接登录成功。
image.png
关于cookie 和 session 几个很好的教程 :
https://www.jianshu.com/p/3fb707a166f3
网友评论