node-session-cookie--9

2019-08-07  本文已影响0人  Mcq

9

1. 登录

目标:使用 users表中记录的用户和对应的密码进行登录

image.png

思路分析:

  1. 创建 /login 路由用来显示login.html页面

  2. 创建 /checkLogin 路由,检测用户名、检测密码、注册session

    ① 接收用户名和密码: req.body

    ② 检测用户名: select * from ali_admin where user_name=?

    ==查询结果为一条数据则用户名正确,反之用户名错误==

    ③ 检测密码: 表单提交密码和上一步查询出的密码进行比较

    ④ 显示成功/失败,页面跳转

代码实现:

  1. 创建 /login 路由用来显示login.html页面


    image.png
image.png
  1. 创建 /checkLogin 路由,检测用户名、检测密码、注册session

① 接收数据 ==> 接收用户名和密码

② 拼接SQL语句 ==> select * from users where user_name=? and user_pwd=?

③ 执行SQL语句 ==> db.query()

④ 处理SQL执行结果 ==> 如果用户名密码正确跳转到学生信息列表页,如果不正确跳转回登录页

image.png

2. 会话控制概述

  1. http协议的缺陷

    无状态,就是无记忆,不能让同一浏览器和服务器进行多次数据交换时,产生业务的连续性。

  1. 什么是会话控制

    会话控制就是解决http无记忆的缺陷的。能够==将数据持久化的保存在客户端(浏览器)或者服务器端==,从而让浏览器和服务器进行多次数据交换时,产生连续性。

  1. 会话控制的分类

3. cookie技术

3.1 什么是cookie

cookie应用实例 --- 千人千面(猜你喜欢)


image.png

3.2 设置cookie

//1. 使用 setHeader 方法
res.setHeader('cookie', 'id=101');                   //设置单个cookie
res.setHeader('cookie', ['id=101', 'name=zs']);      //设置多个cookie

//2. 使用 writeHeader 方法
res.writeHeader(200, {
    'content-type': 'text/html;charset=utf-8',
    'set-cookie': ['type=10', 'name=my']
});

//3. 使用 set 方法,该方法是express封装的方法
res.set({'set-cookie':['goodsName=xiaomi 6', 'goodsPrice=3999']});

//4. 设置cookie时,指定有效期
//注意:要使用UTC时间,使用 toUTCString()方法转换
//设置有效期为 1小时
const expiresTime = new Date(Date.now() + 3600000).toUTCString();
res.set({'set-cookie':['goodsName=xiaomi 6;expires=' + expiresTime, 'goodsPrice=3999']})
image.png

查看响应头:

image.png

浏览器中查看保存的cookie:


image.png image.png

3.3 读取cookie

核心: req.headers.cookie 中

const qs = require('querystring');
const obj = qs.parse('id=10001;name=zs', ';', '=');
console.log(obj);   // {id:10001, name:"zs"}

3.4 cookie有效期

4. session技术

4.1 session介绍

4.2 设置/读取session

express设置session时,需要使用第三方模块 --- express-session

使用步骤:

  1. 加载 express-session 模块

  2. 将session注册为中间件

  3. 使用req.session对象设置/读取session

//1. 加载 express-session 模块
const session = require('express-session');
//2. 配置项
const obj = {
    secret: '4ey32erfyf3fgpg',   //加密字符串。 使用该字符串来加密session数据,自定义
    resave: false,               //强制保存session即使它并没有变化
    saveUninitialized: false     //强制将未初始化的session存储。当新建了一个session且未
                                 //设定属性或值时,它就处于未初始化状态。
};
//3. 注册为express-session中间件
app.use(session(obj));

//4. 使用 req.session.属性 = 值  方式来设置session
app.get('/sets', (req, res) => {
    req.session.isLogin = true;
    req.session.userInfo = {user_id:10001, user_name:"zs"};
    //注意:一定要将数据发回给浏览器,否则session无法生效
    res.send('设置session');
});

//设置好之后,req.session中的结构
req.session = {
    isLogin: true,
    userInfo: {user_id:10001, user_name:"zs"}
}

4.3 session有效期

4.4 删除session

核心: req.session.destroy() 销毁所有session

4.5 session 的有效范围

在一个网站中设置了session,则整个网站都能找到这个session

5. 登录功能完善

核心: 登录成功后注册session信息,在每个页面中检测session是否存在

思路:

  1. 在 /checkLogin 中,当正常登录以后将用户信息和已登录状态记录到session中

  2. 在其他路由监听中增加session检测的步骤,除了 /login 和 /checkLogin

注意: session时需要使用到 express-session模块,首先要加载该模块并注册为中间件

代码实现:

  1. 在 app.js 中加载express-session模块,并注册为中间件
image.png
  1. 在 /checkLogin 中,当正常登录以后将用户信息和已登录状态记录到session中
image.png
  1. 在其他路由中检测session(就是检测 session.isLogin是否为true)
image.png

6. cookie和session的原理

6.1 cookie原理

  1. 浏览器第一次访问带有cookie设置的路由时,服务器会将cookie信息通过响应头返回给浏览器

  2. 之后浏览器每次访问服务器时都会将cookie信息通过请求头发送给服务器

6.2 session原理

image.png
  1. 浏览器第一次访问带有session设置的路由时,服务器会自动产生一个sessionId(一个很长的随机字符串),该sessionId有两个作用

    ① 随着cookie返回给浏览器,保存在浏览器中 (==相当于一把钥匙==)

    ② 在服务器开辟一块内存并以该sessionId命名,将数据保存在该内存中 (==相当于一个箱子==)

  1. 浏览器之后每一次访问服务器时,sessionId都会随着请求头发送给服务器,服务器就能根据sessionId

7. 中间件

7.1 什么是中间件

自来水生产流程:

image.png

d:/aaa/ABC.JPG: 截取文件后缀并转为小写


image.png

上图中lastIndexOf、slice、toLowerCase几个方法就可以认为是中间件

中间件按顺序调用,对字符串 d:/aaa/ABC.JPG进行加工,得到最终的结果

Express是一种路由和中间件的Web框架,Express应用程序本质上是一系列中间件函数调用。

==express中间件是一个特殊的url地址处理函数==

7.2 自定义中间件

案例1: 记录日志中间件

目标: 每当浏览器输入地址访问时,就将当前访问的url和时间保存到 run.log 文件中

  1. 在每个路由监听中使用fs.appendFile将url地址和时间记录到run.log文件中


    image.png

缺点:每个路由监听中都要使用fs写文件,非常麻烦

  1. 将写run.log的方法封装为一个函数
image.png
  1. 将writeLog封装为中间件函数,并注册为中间件
image.png

案例2: 自定义url检测中间件,不存在的url地址直接显示 404 not found

image.png

7.3 图例中间件工作原理

image.png

7.4 检测登录状态中间件

方法: 在每个路由中都要检测 isLogin 的状态,除了 /login 和 /checkLogin

image.png

7.5 中间件类别

express有五中类别的中间件:

上一篇下一篇

猜你喜欢

热点阅读