静态服务器
动态服务器
判断静态服务器和动态服务器(也叫静态网页和动态网页),看是否请求了数据库。如果没有请求数据库,就是静态服务器;请求里数据库,就是动态服务器。
实战
/db/users.json作数据库
结构
[
{"id":1,"name":"river","password":"xxx"},
{"id":2,"name":"lyn","password":"yyy"}
]
读取users数据
先toString(),再JSON.parse()(反序列化),得到数组
存储users数据
先JSON.stringify()(序列化),得到字符串,再写入数据
第一步 实现用户注册
功能
用户提交用户名和密码,users.json里就新增一行数据
思路
前端写一个form,让用户填写name和password,监听submit事件,发送post请求,数据位于请求体。
后端接受post请求,获取请求体中的name和password,存储数据。
第二步 实现用户登录功能
功能
首页home.html,已登录用户可看到自己的用户名
登录页sign_in.html,供提交用户名和密码
输入的用户名密码如果是匹配的,就自动跳转首页
思路
前端写一个form,让用户填写name和password,监听submit事件,发送post请求,数据位于请求体。
后端接受post请求,获取请求体中的name和password,读取数据,看是否有匹配的name和password,如果匹配,后端应标记用户已登录。
第三步 标记用户已登录
Cookie
定义
Cookie是服务器下发给浏览器的一段字符串,浏览器必须保存这个Cookie(除非用户删除),之后发起相同二级域名请求(任何请求)时,浏览器必须附上Cookie。
Set-Cookie 响应头
第四步 显示用户名
home.html 渲染前获取user信息
如果有user,则将{{user.name}}替换成user.name
如果无user,则显示登录按钮
第五步 防篡改 user_id
思路一:加密
将user_id加密发送给前端,后端读取user_id时解密
此法可行,但有安全漏洞,加密后的内容可无限期使用。解决办法:JWT。
思路二:把信息隐藏在服务器
把用户信息放在服务器的session里,再给信息一个随机id,把随机id发给浏览器
后端下次读取到id时,通过session[id]获取用户信息
session是文件,不能用内存,因为断电内存就清空
为什么这样用户无法篡改id?
因为id长且随机。
第六步 注销
思路
将session id从session里删掉
将cookie从浏览器删掉(可选)
实现
前端制作注销按钮,监听注销按钮事件,前端发送delete session请求
后端接受delete session请求,获取当前session id,并将其删除,后端下发一个过期的同名Cookie(因为没有删除)
第七步 防止密码泄露
不要存明文
拿到明文之后,bcrypt.js加密,得到密文,将密文保存到user.json
用户登录时,加密后对比密文是否一致,一致则说明用户知道密码,可以登录
不要用MD5
MD5甚至都不是一种加密算法,是hash算法