40.Express基础学习(三)

上一篇:Express基础学习(二)

第5章:EJS模板

5.1 EJS是什么

EJS是一个高效的 JavaScript 模板引擎。
模板引擎是为了使用户界面与业务数据(内容)分离而产生的。
简单来说,使用EJS模板引擎就能动态渲染数据。

5.2 EJS的使用

  1. 下载安装

    npm i ejs --save
    
  2. 配置模板引擎

    app.set("view engine" , "ejs");
    
  3. 配置模板的存放目录

    app.set("views","./views")
    
  4. 在views目录下创建模板文件

    xxx.ejs
    
  5. 使用模板,通过response来渲染模板

    response(‘模板名称’, 数据对象)
    

5.3 EJS语法

以下是一个ejs文件:

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>

<h1>Hello EJS,这是我的第一个EJS</h1>
//<% code %> 执行其中的JS代码
<%
    console.log("Hello EJS");
    var a = 30;
%>

//<%=username%> 输出转义的数据到模板上
<h2>用户名 : <%=username%></h2>
//<%-username%> 输出非转义的数据到模板上
<h2>用户名 : <%-username%></h2>

//<% %> 可以包含JS代码与下面拼接在一起
<%
    if(a==20){
%>

<h3>a的值是20</h3>

<%
    }
%>

<%
for(var i=0 ; i<3 ; i++){
%>

<h3>老师真帅啊!!!!!</h3>

<%
}
%>

</body>
</html>

第6章:会话控制

6.1会话控制是什么

HTTP协议是一个无状态的协议,它无法区分多次请求是否发送自同一客户端。
而我们在实际的使用中,却又大量的这种需求,我们需要通过会话的控制来解决该问题。

6.2 cookie

6.2.1 cookie是什么

cookie本质是一个存储在浏览器的文本,随着http请求自动传递给服务器。
也可以说cookie是一个头(请求头/响应头):
服务器以响应头的形式将Cookie发送给浏览器
浏览器收到以后会自动将Cookie保存
浏览器再次访问服务器时,会以请求头的形式将Cookie发回
服务器就可以通过检查浏览器发回的Cookie来识别出不同的浏览器

6.2.2 cookie的不足

各个浏览器对cookie的数量和大小都有不同的限制,这样就导致我们不能在Cookie中保存过多的信息。一般数量不超过50个,单个大小不超过4kb。
cookie是由服务器发送给浏览器,再由浏览器将cookie发回,如果cookie较大会导致发送速度非常慢,降低用户的体验。

6.2.3 cookie的使用

通过配置cookie-parser中间件,可以将cookie解析为一个对象,并且添加为req的cookies属性,使用步骤:

  1. 下载安装

    npm i cookie-parser --save
    
  2. 引入

    var cookieParser = require("cookie-parser");
    
  3. 设置为中间件

    app.use(cookieParser());
    
  4. 创建Cookie

    res.cookie("username","sunwukong" , {maxAge:15000});
    //设置一个有效期为1天的cookie
    res.cookie("username","sunwukong" , {maxAge:1000*60*60*24});
    //设置一个永久有效的cookie
    res.cookie("username","sunwukong" , {maxAge:1000*60*60*24*365*10});
    
  5. 修改Cookie

    //Cookie一旦发送给浏览器,就不能再修改了
    	//但是我们可以使用同名的cookie来替换已有cookie
    res.cookie("username","zhubajie");
    
  6. 删除Cookie

    //可以通过通过使用一个立即失效的cookie来替换cookie的形式来删除cookie
    res.cookie("username","11",{maxAge:0});
    //用来删除一个cookie
    res.clearCookie(“username”)用来删除一个指定cookie
    

6.3 session

6.3.1 session是什么

Session 是一个对象,存储特定用户会话所需的属性及配置信息。

6.3.2 session运作流程

我们可以在服务器中为每一次会话创建一个对象,然后每个对象都设置一个唯一的id,并将该id以cookie的形式发送给浏览器,然后将会话中产生的数据统一保存到这个对象中,这样我们就可以将用户的数据全都保存到服务器中,而不需要保存到客户端,客户端只需要保存一个id即可。

6.3.3 session的使用

  1. 下载安装

    npm i connect-mongo express-session --save
    
  2. 引入模块

    var session = require("express-session");
    
  3. 将其配置为express-session的默认的持久化仓库

    var MongoStore = require('connect-mongo')(session);
    
  4. 设置为中间件

    app.use(session({
      name: 'id22',   //设置cookie的name,默认值是:connect.sid
      secret: 'atguigu', //参与加密的字符串(又称签名)
      saveUninitialized: false, //是否为每次请求都设置一个cookie用来存储session的id
      resave: true ,//是否在每次请求时重新保存session
      store: new MongoStore({
        url: 'mongodb://localhost:27017/test-app',
        touchAfter: 24 * 3600 // 24小时之内只修改一次
      }),
      cookie: {
        httpOnly: true, // 开启后前端无法通过 JS 操作
        maxAge: 1000*30 // 这一条 是控制 sessionID 的过期时间的!!!
      },
    }));
    

6.3.4 cookie和session的区别

  1. 存在的位置:
    cookie 存在于客户端,临时文件夹中
    session 存在于服务器的内存中,一个session域对象为一个用户浏览器服务
  2. 安全性:
    cookie是以明文的方式存放在客户端的,安全性低,可以通过一个加密算法进行加密后存放
    session存放于服务器的内存中,所以安全性好
  3. 网络传输量:
    cookie会传递消息给服务器
    session本身存放于服务器,但是通过cookie传递id,会有少量的传送流量
  4. 生命周期(以20分钟为例):
    cookie的生命周期是累计的,从创建时,就开始计时,20分钟后,cookie生命周期结束
    session的生命周期是间隔的,从创建时,开始计时如在20分钟,没有访问session,那么session生命周期被销毁;但是,如果在20分钟内(如在第19分钟时)访问过session,那么,将重新计算session的生命周期;关机会造成session生命周期的结束,但是对cookie没有影响
  5. 访问范围:
    session为一个用户浏览器独享
    cookie为多个用户浏览器共享
  6. 大小:
    cookie 保存的数据不能超过4K,很多浏览器都限制一个站点最多保存50个cookie
    session 保存数据理论上没有任何限制(内存有多大就能有多大)

6.4 express中操作cookie和session教程

6.4.1 操作cookie:

  1. 设置cookie(给客户端“种”cookie):
    直接使用res.cookie('','',{})即可。

  2. 获取cookie(要第三方中间件):

    • 安装:npm i cookie-parser
    • 引入:const cookieParser = require('cookie-parser')
    • 使用:app.use(cookieParser())
  3. 返回给客户端一个cookie:

    • res.cookie('username','peiqi',{maxAge:1000*60*60})

      备注:
      1. cookie是以:key-value的形式存在的,前两个参数分别为:key、value。
      2. maxAge用于配置cookie有效期(单位毫秒)。
      3. 如果不传入maxAge配置对象,则为会话cookie,随着浏览器的关闭cookie自动会消失。
      4. 如果传入maxAge,且maxAge不为0,则cookie为持久化cookie,即使用户关闭浏览器,
      cookie也不会消失,直到过了它的有效期。

  4. 接收客户端传递过来的cookie:

    • req.cookies.xxx :获取cookie上xxx属性对应的值。
      备注: cookie-parser中间件会自动把客户端发送过来的cookie解析到request对象上。

6.4.2 操作session(cookie配合session)

  1. 下载安装:

    npm i express-session --save  用于在express中操作session
    
  2. 下载安装:

    npm i connect-mongo --save 用于将session写入数据库(session持久化)
    
  3. 引入express-session模块:

    const session = require('express-session');
    
  4. 引入connect-mongo模块:

    const MongoStore = require('connect-mongo')(session);
    
  5. 编写全局配置对象:

    app.use(session({
    ​    name: 'userid',   //设置cookie的name,默认值是:connect.sid
    ​    secret: 'atguigu', //参与加密的字符串(又称签名)
    ​    saveUninitialized: false, //是否在存储内容之前创建会话
    ​    resave: true ,//是否在每次请求时,强制重新保存session,即使他们没有变化
    ​    store: new MongoStore({
    ​    	url: 'mongodb://localhost:27017/sessions_container',
    ​    	touchAfter: 24 * 3600 //修改频率(例://在24小时之内只更新一次)}),
    ​    cookie: {
    ​        httpOnly: true, // 开启后前端无法通过 JS 操作cookie
    ​        maxAge: 1000*30 // 设置cookie的过期时间},}
    ));
    
  6. 向session中添加一个xxxx,值为yyy:req.session.xxxx = yyy

  7. 获取session上的xxx属性:const {xxx} = req.session

整个过程是:

  1. 客户端第一次发起请求,服务器开启一个session专门用于存储这次请求的一些信息。
  2. 根据配置对象的信息,服务器决定是否进行:session持久化等其他操作。
  3. 与此同时服务器创建了一个cookie,它的key我们可以自己指定,但是它的value一定是上一步session的唯一标识。
  4. 服务器将我们指定好的内容添加进session对象,例如:req.session.xxxx = yyy
  5. 等请求再次过来时,客户端的请求中包含着之前“种”的cookie。
  6. 服务器检查携带过来的cookie是否有效,决定是否去读取对应session中的信息。

下一章:HTTP协议

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值