目录
前言
上次实现了一个最简单的登录功能,用到了mysql和php。【最简单的网页登录注册功能讲解及其实现】,今天来进一步编写登录后续的操作,注意本篇博客的内容基于上一篇博客。我们将在此基础上,实现持久化登录以及用户的身份识别。
持久化登录介绍
http是一种无状态协议,这意味着你在a页面登录,然后访问同一站点的b页面,b页面并不会知道你已经登录了,这是坏的。
持久化登录顾名思义,就是登录一次,终身有效,这样非常方便。我们知道一般的网站登录都会有以下几个特征:
- 只用登录最初的一次,之后都可以直接登录
- 在不同页面跳转,不用重新登录
- 任意页面都能够正确识别登录的用户是谁
我们希望实现以上的功能,我们第一个想法就是每个页面都设置登录验证,这样对程序员来说实现起来非常方便,但是用户体验非常曰狗,我们希望尽可能减少用户输入密码的次数。
那么让用户在请求的时候,携带一些信息吧,这些信息保存在用户本地磁盘,能够表示用户的偏好,或许也能够表示用户的身份
这就是cookie的概念,cookie顾名思义,减少用户的麻烦,给用户“甜头”,使得无状态的http协议具有一定的记忆性,接下来介绍cookie。
cookie
cookie介绍
cookie由服务端下发,即请求返回时,服务器在http头中写入cookie信息。
cookie存放于用户的磁盘中,每个站点都有其专属的cookie,每当同一台计算机通过浏览器请求页面时,这台计算机将会发送 cookie,即http的包头都会带上cookie,而后台服务程序也可以接受相应的cookie,并且做出判断。
cookie携带账号密码?
通过cookie携带账户与密码,我们可以不用输入密码,就将信息传给后台,但是这面临问题:
- 如果发生页面跳转,会频繁查询用户账户数据库,带来开销
- 频繁的传输账号密码,信息泄露的风险增加了
cookie存储登录标志?
我们通过cookie存储一个数字,如果是0表示未登录,而如果是1表示登录,这样每次页面跳转,都检查cookie不就好了?可是这么做同样有两个问题:
- cookie存在于客户端磁盘,用户可以篡改cookie,比如把cookie改成1强行登录
- 无法通过简单的状态判断用户的身份,因为无论是a用户还是b用户登录,他们的cookie值都是1
因为登录状态存在于客户端,这是不安全的,我们希望有一些存在于服务器上的信息,这样远程用户不可以篡改这些信息,安全性提高了,这就有了session的概念
session
session简介
session又名会话,是一种存在于服务器内存中的【容器】,一个session类似一张map,可以存储【键值对】,通过键找到值的容器。
每个session都有独立的id,这些id不重复,我们称之为session id
,它唯一地标识了session。
一个session可以简单的理解成【和浏览器对应的容器】,每个浏览器仅可以开启一个session,不同的浏览器请求页面,服务器php代码中的session_start()
函数会启动不同的session。下面介绍session的生存周期
session的生存周期
- 从用户请求页面开始,建立session
- 用户访问同一站点的不同页面,session一直存在且只存在一个
- 用户关闭浏览器,用户丢失session
- session仍然存在于服务器上,服务器并未丢失session,除非服务器程序重启
- 太久未修改的session,会被服务器垃圾删除
session描述了“会话”的概念,即在不同的页面中跳转,客户端与服务器的会话,始终对应到一个session
session存储登录标志?
我们知道,session是存在于服务器的,那么可以用session来存储用户是否登录的信息。每次页面跳转时,查询session中的信息,然后就可以知道用户是否登录了。可是这么做仍然无法标识用户的身份,因为不管是张三还是李四登录,他们的session中的信息都是“登录状态:已登录”
。
cookie+session存储用户信息以区分用户
我们需要利用session的特性,我们存储用户的信息在每个用户的session中
- 我们存储用户的用户名在对应的session中
- 我们下发一个cookie,这个cookie的内容是
session id
,即session的唯一标识 - 用户每次页面跳转请求,cookie中带上
session id
,我们就可以通过session id
找到对应的session,进而区分不同的用户。
值得注意的是,因为cookie是我们下发的,用户无法伪造,而session是存储于服务端的,用户也无法修改其内容。这样保证了一定的安全性。
如下图描述了第一次登录时,服务器创建session以及返回cookie的过程
下图描绘了后面的若干次页面跳转,无需再次登录,服务器通过cookie中的session id 验证用户登录状态以及区分用户身份
注销
注销的时候,因为我们知道当前用户对应的时哪一个session,我们关闭对应的session,然后销毁用户的cookie即可。
代码实现
实现思路
首先来看初次登录,我们需要有以下几个步骤
- 登录页面提交用户输入给后台登录验证程序
- 验证程序通过验证,创建session
- 下发session id 作为cookie
- 登录页面跳转到登录成功页面
- 登录成功页面利用cookie中的session id 找到对应session中的用户身份信息
- 登录成功页面打印【欢迎 + 用户名】