当我们登录一个网站的时候,服务器干了什么?

当我们登录一个网站的时候,发生了什么?

下面有几个问题,可以帮我们更好的理解这个问题。在登录一个网站的时候,点击登录的按钮之后,发生了什么:

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

服务器相应的页面如下图说是,现在已经表示登录成功。

《当我们登录一个网站的时候,服务器干了什么?》 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

http://cizixs.com/2017/03/08/flask-insight-session

    原文作者:爱秋刀鱼的猫
    原文地址: https://www.jianshu.com/p/1743e0630ab6
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞