美文网首页生活不易 我用pythonpython热爱者PHP经验分享
当我们登录一个网站的时候,服务器干了什么?

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

作者: 爱秋刀鱼的猫 | 来源:发表于2018-01-17 16:30 被阅读86次

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

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

    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.haomeiwen.com/subject/pyduoxtx.html