动态服务器的相关知识,内容包括什么是动态服务器、实现用户注册功能、实现用户登录功能、标记用户已登录、显示用户名、防篡改 user_id、Question & Answer。
一、什么是动态服务器
1. 判断依据
动态服务器与静态服务器相对应,判断依据为:
- 是否请求了数据库
没有请求数据库,就是静态服务器,请求了数据库,就是动态服务器
2. /db/users.json
这里直接用 json 文件当做数据库
结构:一个数组
// 注意下面省略了双引号,是错误的写法
[
{id: 1,name:' frank' ,password: '***' age: 18},
{id: 2, name: 'jack', password: '***', age: 20}
]
复制代码
读取 users 数据
- 先 fs.readFileSync('./db/user.json).toString()
- 然后 JSON.parse 一下(反序列化),得到数组
存储 user 数据
- 先 JSON.stringify 一下(序列化),得到字符串
- 然后 fis.readFileSync('./db/users/json',data)
二、目标 1 -- 实现用户注册功能
用户提交用户名和密码,user.json 里就新增了一行数据
思路
- 前端写一个 form,让用户填写 name 和 password
- 前端监听 submit 事件
- 前端发送 post 请求,数据位于请求体
- 后端接收 post 请求
- 后端获取请求体中的 name 和 password
- 后端存储数据
三、目标 2 -- 实现用户登录功能
首页 home.html,已登录用户可看到自己的用户名,登录页 sign_in.html,提交用户名和密码
sign_in.html 思路
- 前端写一个 form,让用户填写 name 和 password
- 前端监听 submit 事件
- 前端发送 post 请求,数据位于请求体
- 后端接收 post 请求
- 后端获取请求体中的 name 和 password
- 后端读取数据,看是否有匹配的 name 和 password
- 如果匹配,后端应该标记用户已登录,可是怎么标记?
四、目标 3 -- 标记用户已登录
目标 2 受阻,目标太大了,目标应该尽量小
Cookie
Cookie 是服务器下发给浏览器的一段字符串,浏览器必须保存这个 Cookie(除非用户删除),之后发起相同二级域名请求(任何请求)时,浏览器必须附上 Cookie
以公园门票作为对比,假如你是公园检票员,你怎么知道谁能进谁不能进?有票能进,没票不能进,Cookie 就是门票,有 Cookie 就是登陆了,没 Cookie 就没登录,那后端给浏览器下发一个 Cookie 不就完事了嘛
Set-Cookie 响应头的语法看 MDN 文档
home.html 怎么知道登录的是谁呢?把 logined 改成 user_id
五、目标 4 -- 显示用户名
home.html 先软前获取 user 信息,如果有 user,则将 {{user.name}} 替换成 user.name,如果无 user,则显示登录按钮
有一个大 bug:用户可以篡改 user_id 啊啊啊!开发者工具或者 JS 都能改
六、目标 5 -- 防篡改 user_id
1. 思路一:加密
将 user_id 加密发送给前端,后端读取 user_id 时解密,此法可行,但是又安全漏洞