动态服务器
动态服务器跟静态服务器最主要的区别就是在于是否请求了数据
今天做一个简易版的注册 登录功能 ,AJAX 的实战:包含不限于( Cookie Session)
下面是文件目录
/ -> db -> users.json //存用户账号和密码文件 -> public -> home.html //显示已登录 or 未登录网页 -> register.html //注册网页 -> sign_in.html //登录网页 -> server.js //服务器 -> session.json //防止用户篡改的数据库(主要目的是防止用户更改ID)
1. Register.html 注册页面
<!-- -->
<body>
<form id="registerForm">
<div> <label for="">用户名:<input type="text" name="name"/></label></div>
<div> <label for="">密码:<input type="password" name="password"/></label></div>
<div> <button type="submit">注册</button> </div>
</form>
<!-- 引用jQuery库 -->
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
<script>
const $form = $("#registerForm")
$form.on("submit",(e)=>{
e.preventDefault();
const name = $form.find("input[name=name]").val()
const password = $form.find("input[name=password]").val()
$.ajax({
method:"POST",
url:"/register",
contentType:"text/json;charset=UTF-8",
data:JSON.stringify({name,password})
}).then(
()=>{
alert('注册成功')
location.href="./sign_in.html"
},
()=>{}
)
})
</script>
</body>
<!--Event.preventDefault:当点击注册页面会刷新,此方法是阻止这种默认的行为-->
<!--find():找到该元素并且获得元素的值val() -->
<!--$ajax():发送请求(时带着 请求方法 url 内容类型 数据) -->
<!--then():接收两个参数第一个成功(时做什么)第二个失败(时做什么) -->
<!--location.href:该操作会跳转到设置的网页 -->
写在 server.js 里做出响应
//以下代码不是完整代码 只是当请求/register 做出响应
if(path === "/register" && method === "POST"){
response.setHeader("ContentType","text/html;charset=UTF-8")
const userArray = JSON.parse(fs.readFileSync("./db/users.json"))
const array = []
request.on("data",(chunk)=>{
array.push(chunk)
})
request.on("end",()=>{
const string = Buffer.concat(array).toString()
const obj = JSON.parse(string)
//创建一个对象包含新的用户名
const newUser = {
id:userArray.length ===0?1:userArray[userArray.length-1].id+1,
name:obj.name,
password:obj.password
}
//添加新的用户名
userArray.push(newUser)
//写出数据库 user.json
fs.writeFileSync("./db/user.json",JSON.stringify(userArray))
//响应结束
response.end()
})
}
2. sign_in .html 登录页面
<form id="signInForm">
<div> <label for="">用户名<input type="text" name="name"/> </label> </div>
<div> <label for="">密码<input type="password" name="password" /> </label> </div>
<div> <button type="submit">登录</button>
</form>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
<script>
const $form = $("#signInForm")
$form.on("submit", (e)=>{
e.preventDefault()
const name = $form.find("input[name=name]").val()
const password = $form.find("input[name=password]").val()
$.ajax({
method:"POST",
url:"/sign_in",
contentType:"text/json;charset=UTF-8",
data:JSON.stringify({name,password})
}).then(
()=>{
alert('登录成功')
location.href="./home.html"
},
()=>{}
)
})
//基本跟注册差不多,区别就在后端里处理跟返回不一样
</script>
写在 server.js 里做出响应
if (path === "/sign_in" && method === "POST") {
response.setHeader("Content-Type", "text/html;charset=UTF-8");
const userArray = JSON.parse(fs.readFileSync("./db/users.json"));
const array = [];
request.on("data", chunk => {
array.push(chunk);
});
request.on("end", () => {
const string = Buffer.concat(array).toString();
const obj = JSON.parse(string);
const user = userArray.find(
user => user.name === obj.name && user.password === obj.password
);
if (user === undefined) {
response.statusCode = 400;
response.setHeader("Content-Type", "text/json ;charset=UTF-8");
response.end(`{"errorCode":4001}`);
} else {
response.statusCode = 200;
const random = Math.random();
session[random] = { user_id: user.id };
fs.writeFileSync("./session.json", JSON.stringify(session));
response.setHeader("Set-Cookie", `session_id=${random};HttpOnly`);
response.end();
}
});
}
//唯一思路就是在user.json里找到它并且成功返回即可.在sign_in里有js代码自动跳转到home页面
注册跟登录在前台这一块区别不大都是获取到数据传给后台。逻辑在后台比较好.只不过后台返回给前台的各有不同
注册:前台把用户名和密码传给后台,后台存入数据库.
登录:前台把用户名和密码传给后台,后台读取数据库,看在不在数据库里面即可.
完整源代码