前后分离:AJAX实战、Cookie、Session

275 阅读2分钟

动态服务器

动态服务器V.S静态服务器

  • 也叫动态网页V.S静态网页

判断依据

  • 是否请求了数据库:没有请求数据库,就是静态服务器;请求了数据库,就是动态服务器。

  • 数据库:不属于前端范畴,但是要了解一些。

image.png

const fs = require("fs"); //引入读数据库的fs

//读数据库
const usersString = fs.readFileSync("./db/users.json").toString();
const usersArray = JSON.parse(usersString); // 反序列化

//写数据库
const user3 = { id: 3, name: "tom", password: "yyy" };
usersArray.push(user3);
const string = JSON.stringify(usersArray); //序列化
fs.writeFileSync("./db/users.json", string);

目标一

image.png

<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();
        console.log(name, password);
       //获取name和password
       //发送AJAX请求
        $.ajax({
          method: "POST",
          url: "/register",
          contentType: "test/json ; charset=UTF-8",
          data: JSON.stringify({ name, password }),
        }).then(
          () => {
            alert("注册成功");
            location.href = "/sign_in.html";
          },
          () => {}
        );
      });
    </script>

目标二

image.png

  • 目标2受阻,目标太大了,目标应该尽量小

目标三(标记用户已登录)

Cookie

定义

  • Cookie是服务器下发给浏览器的一段字符串

  • 浏览器必须保存这个Cookie(除非用户删除)

  • 之后发起相同二级域名请求(任何请求)时,必须附上Cookie

  • Cookie 相当于门票,有Cookie就是登录了,没Cookie就没登录

Set-Cookie响应头

  • 语法
Set-Cookie: <cookie-name>=<cookie-value>
Set-Cookie: <cookie-name>=<cookie-value>; Expires=<date>  //设置有效的时间
Set-Cookie: <cookie-name>=<cookie-value>; Max-Age=<non-zero-digit>  //设置最大的时间
Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>  //设置域名
Set-Cookie: <cookie-name>=<cookie-value>; Path=<path-value>  //设置路径
Set-Cookie: <cookie-name>=<cookie-value>; Secure  //设置是否只在HTTPS的时候附带
Set-Cookie: <cookie-name>=<cookie-value>; HttpOnly  //不准前端碰Cookie, 一定要加上

Set-Cookie: <cookie-name>=<cookie-value>; SameSite=Strict
Set-Cookie: <cookie-name>=<cookie-value>; SameSite=Lax

// Multiple directives are also possible, for example:
Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>; Secure; HttpOnly

目标四

image.png

目标五

image.png

Cookie/Session 总结

服务器可以给浏览器下发Cookie

  • 通过Response Header

  • 具体语法见MDN

浏览器上的Cookie可以被篡改

  • 用开发者工具就能改

  • 弱智后端下发的Cookie 用JS也能篡改

服务器下发不可篡改的Cookie

  • Cookie可包含加密后的信息(还得解密,麻烦)

  • Cookie也可只包含一个id (随机数)

  • 用session[id] 可以在后端拿到对应的信息

这个id无法被篡改

  • 但可以被复制,问题不大。