前后端分离:Ajax实战

236 阅读3分钟

静态服务器

源码

动态服务器

源码

判断静态服务器和动态服务器(也叫静态网页和动态网页),看是否请求了数据库。如果没有请求数据库,就是静态服务器;请求里数据库,就是动态服务器。

实战

/db/users.json作数据库

结构

[
    {"id":1,"name":"river","password":"xxx"},
 	{"id":2,"name":"lyn","password":"yyy"}
]

读取users数据

toString(),再JSON.parse()(反序列化),得到数组

image-20210522111217182.png

存储users数据

JSON.stringify()(序列化),得到字符串,再写入数据

image-20210522111231980.png

第一步 实现用户注册

功能

用户提交用户名和密码,users.json里就新增一行数据

思路

前端写一个form,让用户填写namepassword,监听submit事件,发送post请求,数据位于请求体。

后端接受post请求,获取请求体中的namepassword,存储数据。

第二步 实现用户登录功能

功能

首页home.html,已登录用户可看到自己的用户名

登录页sign_in.html,供提交用户名和密码

输入的用户名密码如果是匹配的,就自动跳转首页

思路

前端写一个form,让用户填写name和password,监听submit事件,发送post请求,数据位于请求体。

后端接受post请求,获取请求体中的name和password,读取数据,看是否有匹配的name和password,如果匹配,后端应标记用户已登录。

第三步 标记用户已登录

Cookie

定义

Cookie是服务器下发给浏览器的一段字符串,浏览器必须保存这个Cookie(除非用户删除),之后发起相同二级域名请求(任何请求)时,浏览器必须附上Cookie。

Set-Cookie 响应头

MDN

第四步 显示用户名

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算法

深入阅读