最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Express框架實(shí)現(xiàn)簡單攔截器功能示例

 更新時(shí)間:2023年05月17日 09:13:05   作者:Teacher_Tian_2019  
這篇文章主要介紹了Express框架實(shí)現(xiàn)簡單攔截器功能,結(jié)合實(shí)例形式分析了express框架攔截器相關(guān)功能與使用方法,需要的朋友可以參考下

1、前言

  在前文express框架+bootstrap美化ejs模板提到,考試成績屬于非公開的數(shù)據(jù)。需要根據(jù)瀏覽器端訪問的用戶的身份進(jìn)行判斷,如果是有權(quán)限的用戶才會(huì)返回相應(yīng)的數(shù)據(jù)。這種功能就是本節(jié)我要說明的“攔截器”。

2、分析

  首先,要完成攔截器的功能,需要有session的支持,我們需要下載express-session模塊:

npm install --save express-session

3、開發(fā)過程

3.1、引入express-session模塊

  在入口腳本app.js中,引入express-session模塊:

var session = require("express-session");

3.2、完成session配置

  在入口腳本app.js中,設(shè)置session到app上,完成session的配置:

// 設(shè)置session中間件
app.use(session({
  secret: 'keyboard cat',
  resave: false,              //強(qiáng)制保存 session 即使它并沒有變化,。默認(rèn)為 true。建議設(shè)置成 false
  saveUninitialized: true,
  cookie: {
    // secure: true,
    maxAge:2*60*60*1000                 /*過期時(shí)間*/
  },
  rolling:true                //在每次請求時(shí)重新設(shè)置 cookie,用于重置 cookie 過期時(shí)間(默認(rèn):false)
}))

3.3、攔截器代碼編寫

  因?yàn)閍pp.js是站點(diǎn)訪問的入口文件,所以為了盡可能的攔截所有的web請求,攔截器需要寫在所有的app.use(準(zhǔn)確地說,是所有的路由)前。下面是從app.js中截取出來的代碼片斷:

//添加攔截器
app.use(function (req, res, next) {
  if(req.session.user){
    //已經(jīng)登錄過的用戶(存在session)
    console.log("這個(gè)用戶已經(jīng)登陸:" + req.session.user.u_name);
    next();
  }else{
    //用戶沒有登錄(session)前
    var arr = req.url.split('/');
    //去除get請求攜帶的參數(shù)
    for (var i = 0; i < arr.length; i++) {
        arr[i] = arr[i].split('?')[0];
    }
    //羅列所有無需權(quán)限檢查的路由
    if (arr[1] === 'login' || arr[1] === 'logout' || arr[1] === '') {
      next();
    } else {
      //最初請求的鏈接也做為參數(shù)傳遞給login頁面
      res.redirect('/login' + req.url);  // 將用戶重定向到登錄頁面
      res.end();
    }
  }
});
/* 盡可能讓攔截器在所有路由的前邊 */
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use('/', indexRouter);
/* 略 */

3.4、登錄功能開發(fā)

  在app.js上方,先引入一個(gè)路由文件,它可以為我們提供登錄的get和post請求處理;

var loginRouter = require('./routes/login');

  在app.js文件中,將loginRouter綁定到/login這個(gè)路徑上:
在這里插入圖片描述
  像上邊這樣,app.js的改造就完成了。接下來看一看./routes/login.js的代碼吧:

var express = require('express');
var router = express.Router();
/* GET login */
router.get('/', function(req, res, next) {
  if(req.session.user){
    res.redirect("/");  // 將用戶重定向到登錄頁面
    res.end();
  }else{
    res.render('login', {redirect_path:""});
  }
});
router.get('/:redirect_path', function(req, res, next) {
  var redirect_path = req.params.redirect_path || "/";
  if(req.session.user){
    res.redirect("/" + redirect_path);  // 將用戶重定向到登錄頁面
    res.end();
  }else{
    res.render('login', {redirect_path});
  }
});
/* POST login */
router.post('/', function(req, res, next) {
  var {u_name,u_password,redirect_path} = req.body;
  var user = {u_name,u_password};
  //密碼校驗(yàn)
  //僅僅是個(gè)模板,省略了從數(shù)據(jù)庫查詢的過程
  if((u_name == "張三" || u_name == "李四") && u_password == "123456"){
    //寫入session
    // req.session.user = {u_name,u_password};
    req.session.regenerate(() => {
      req.session.user = user;
      req.session.success = "Authenticated as " + user.u_name;
      res.redirect("/" + redirect_path);  // 將用戶重定向到登錄頁面
      res.end();
    });
  }else{
    //認(rèn)證失敗
    res.redirect('/login' + req.url);  // 將用戶重定向到登錄頁面
    res.end();
  }
});
module.exports = router;

  在./routes/login.js中提及了login.ejs模板,代碼如下:

<!DOCTYPE html>
<html>
  <head>
    <title>Login</title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <form action="/login" method="POST">
      <div>
        <input type="hidden" name="redirect_path" value = "<%=redirect_path%>">
      </div>
      <div>
          用戶名:<input type="text" name="u_name" />
      </div>
      <div>
          密碼:<input type="password" name="u_password" />
      </div>
      <div>
        <input type="submit" value="登錄">
      </div>
    </form>
  </body>
</html>

  同時(shí),我在這里把score.ejs模板的代碼也貼出來(為本次演示功能的開發(fā)做了一些調(diào)整):

<!DOCTYPE html>
<html>
  <head>
    <title>成績單</title>
    <!-- 引入bootstrap樣式文件 注意這里的href是相對于public目錄的 -->
    <link rel="stylesheet" href="/stylesheets/bootstrap.min.css" rel="external nofollow" >
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <div><%= year %>年高考成績查詢(<%= u_name%>)</div>
    <table>
        <% scores.forEach(function(item,index){ %>
            <tr><td><%= index + 1 %></td><td><%=item.course %></td><td><%=item.score %></td></tr>
        <% }); %>
    </table>
  </body>
</html>

4、驗(yàn)證

  完成以上主要步驟之后,可以啟動(dòng)網(wǎng)站試試了!
初次訪問一下http://localhost:3000/system,結(jié)果是下邊這樣的:
在這里插入圖片描述
  有沒有發(fā)現(xiàn),頁面重定向到了登錄頁面,此時(shí)鏈接也變成了localhost:3000/login/system,其實(shí)system是一個(gè)路由參數(shù)(用于告訴服務(wù)器,在登錄成功之后重定向的位置)。填寫賬號/密碼信息:李四/123456后,效果如下:
在這里插入圖片描述
  再進(jìn)一步驗(yàn)證一下,把瀏覽器關(guān)閉,確保已經(jīng)與服務(wù)器斷開了鏈接,重新訪問主頁,按照login.js中的攔截規(guī)則,主頁/是不被攔截的。
在這里插入圖片描述
   果真如此。

4、寫在最后

  整理到這里就結(jié)束了,雖然描述得不是很細(xì)致,但在以上章節(jié)的代碼中,我想信你可能能體會(huì)到攔截器的用途;并可以參照案例的代碼完成你的練習(xí)。
  最近,在某項(xiàng)目實(shí)踐的過程中,發(fā)現(xiàn)lowdb這種非常輕便小巧的數(shù)據(jù)庫,我也成功地在express項(xiàng)目中完成了CRUD等基本功能。那一下節(jié),我就介紹一下這個(gè)數(shù)據(jù)庫,并講一講如何在express項(xiàng)目中使用lowdb數(shù)據(jù)庫完成基本的CRUD操作吧。

相關(guān)文章

  • node.js生成與讀取csv文件方法詳解

    node.js生成與讀取csv文件方法詳解

    這篇文章主要介紹了node.js生成與讀取csv文件方法詳解,需要的朋友可以參考下
    2022-10-10
  • 解決linux下node.js全局模塊找不到的問題

    解決linux下node.js全局模塊找不到的問題

    今天小編就為大家分享一篇解決linux下node.js全局模塊找不到的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • node打造微信個(gè)人號機(jī)器人的方法示例

    node打造微信個(gè)人號機(jī)器人的方法示例

    這篇文章主要介紹了node打造微信個(gè)人號機(jī)器人的方法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-04-04
  • node登錄生成token并驗(yàn)證的實(shí)現(xiàn)

    node登錄生成token并驗(yàn)證的實(shí)現(xiàn)

    token校驗(yàn)作為項(xiàng)目里的必要項(xiàng),其重要性不言而喻,本文主要介紹了node登錄生成token并驗(yàn)證的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • 初學(xué)者如何快速搭建Express開發(fā)系統(tǒng)步驟詳解

    初學(xué)者如何快速搭建Express開發(fā)系統(tǒng)步驟詳解

    這篇文章主要介紹了初學(xué)者如何快速搭建Express開發(fā)系統(tǒng),結(jié)合實(shí)例形式詳細(xì)分析了express框架搭建的具體步驟與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2023-05-05
  • 詳解nodejs異步I/O和事件循環(huán)

    詳解nodejs異步I/O和事件循環(huán)

    本篇文章主要介紹了nodejs異步I/O和事件循環(huán),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06
  • node實(shí)現(xiàn)socket鏈接與GPRS進(jìn)行通信的方法

    node實(shí)現(xiàn)socket鏈接與GPRS進(jìn)行通信的方法

    這篇文章主要介紹了node實(shí)現(xiàn)socket鏈接與GPRS進(jìn)行通信的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • 使用forever管理nodejs應(yīng)用教程

    使用forever管理nodejs應(yīng)用教程

    這篇文章主要介紹了使用forever管理nodejs應(yīng)用教程,本文介紹了forever的安裝、常用命令等,最有用的莫過于文件改動(dòng)監(jiān)聽并自動(dòng)重啟了,這可以增加開nodejs應(yīng)用的效率,需要的朋友可以參考下
    2014-06-06
  • 一文講解如何把已安裝的nodejs高版本降級為低版本

    一文講解如何把已安裝的nodejs高版本降級為低版本

    部分老舊項(xiàng)目需要使用低版本的node,網(wǎng)上很多是無效的,高版本無法直接安裝低版本node,但是低版本nodejs可以安裝部分高版本node,從而達(dá)到升級效果,下面這篇文章主要給大家介紹了關(guān)于如何把已安裝的nodejs高版本降級為低版本的相關(guān)資料,需要的朋友可以參考下
    2024-06-06
  • Node.js調(diào)用fs.renameSync報(bào)錯(cuò)(Error: EXDEV, cross-device link not permitted)

    Node.js調(diào)用fs.renameSync報(bào)錯(cuò)(Error: EXDEV, cross-device link not

    這篇文章主要介紹了Node.js調(diào)用fs.renameSync報(bào)錯(cuò)(Error: EXDEV, cross-device link not permitted),非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2017-12-12

最新評論

额济纳旗| 柳河县| 若羌县| 酉阳| 阿图什市| 岑溪市| 林西县| 徐闻县| 关岭| 湘潭市| 灵山县| 依兰县| 保康县| 两当县| 察哈| 遂昌县| 沭阳县| 富顺县| 泸定县| 阿克苏市| 施秉县| 乌拉特中旗| 宝山区| 通渭县| 砚山县| 名山县| 和静县| 菏泽市| 望奎县| 虎林市| 武乡县| 阿图什市| 彭山县| 福州市| 佛山市| 诸暨市| 定兴县| 阿拉尔市| 博兴县| 吉林市| 琼结县|