亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

1、前言

  在前文express框架+bootstrap美化ejs模板提到,考試成績屬于非公開的數(shù)據(jù)。需要根據(jù)瀏覽器端訪問的用戶的身份進行判斷,如果是有權限的用戶才會返回相應的數(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中,設置session到app上,完成session的配置:

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

3.3、攔截器代碼編寫

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

//添加攔截器
app.use(function (req, res, next) {
  if(req.session.user){
    //已經(jīng)登錄過的用戶(存在session)
    console.log("這個用戶已經(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];
    }
    //羅列所有無需權限檢查的路由
    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上方,先引入一個路由文件,它可以為我們提供登錄的get和post請求處理;

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

  在app.js文件中,將loginRouter綁定到/login這個路徑上:
在這里插入圖片描述
  像上邊這樣,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};
  //密碼校驗
  //僅僅是個模板,省略了從數(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{
    //認證失敗
    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>

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

<!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、驗證

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

4、寫在最后

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

相關文章

  • Node.js 中 cors 依賴示例詳解

    Node.js 中 cors 依賴示例詳解

    cors是一個用于處理跨域資源共享(CORS)問題的Node.js中間件,可以幫助開發(fā)人員解決前后端分離項目中的跨域問題,該中間件提供了多種配置選項,以滿足不同的跨域需求,如指定允許跨域請求的源、請求方法、請求頭等,本文介紹Node.js  cors 依賴相關知識,感興趣的朋友一起看看吧
    2025-02-02
  • 預防NodeJS命令注入的方法詳解

    預防NodeJS命令注入的方法詳解

    Node.js和npm為前端生態(tài)中提供了統(tǒng)一的開發(fā)語言、強大的包管理和模塊生態(tài)系統(tǒng)、靈活的構建工具和任務自動化、以及豐富的前端框架和庫等等,本文給大家介紹了如何預防NodeJS命令注入,文中有詳細的代碼講解,需要的朋友可以參考下
    2023-12-12
  • Node.js中path.resolve與path.join的區(qū)別與作用詳解

    Node.js中path.resolve與path.join的區(qū)別與作用詳解

    path.resolve和path.join都是屬于path核心模塊下的方法,用來拼接路徑,下面這篇文章主要給大家介紹了關于Node.js中path.resolve與path.join的區(qū)別與作用的相關資料,需要的朋友可以參考下
    2023-03-03
  • nodejs 實現(xiàn)模擬form表單上傳文件

    nodejs 實現(xiàn)模擬form表單上傳文件

    使用nodejs來模擬form表單進行文件上傳,可以同時上傳多個文件。
    2014-07-07
  • node.js中的fs.lstatSync方法使用說明

    node.js中的fs.lstatSync方法使用說明

    這篇文章主要介紹了node.js中的fs.lstatSync方法使用說明,本文介紹了fs.lstatSync的方法說明、語法、接收參數(shù)、使用實例和實現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • nodejs 使用 js 模塊的方法實例詳解

    nodejs 使用 js 模塊的方法實例詳解

    這篇文章主要介紹了nodejs 使用 js 模塊的方法,本文給大家介紹的非常詳細,具有一定的參考借鑒價值 ,需要的朋友可以參考下
    2018-12-12
  • 搭建一個Koa后端項目腳手架的方法步驟

    搭建一個Koa后端項目腳手架的方法步驟

    這篇文章主要介紹了搭建一個Koa后端項目腳手架的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-05-05
  • Nodejs使用SQL模糊查詢的過程詳解

    Nodejs使用SQL模糊查詢的過程詳解

    最近在改一個比較久的項目,是使用nodejs寫的,但是對于長期寫java的后端開發(fā)來說,還是有點難維護,不過不改bug的話,就需要重新開發(fā),所以本文介紹了NodeJs如何使用SQL模糊查詢,需要的朋友可以參考下
    2024-07-07
  • 為nuxt項目寫一個面包屑cli工具實現(xiàn)自動生成頁面與面包屑配置

    為nuxt項目寫一個面包屑cli工具實現(xiàn)自動生成頁面與面包屑配置

    這篇文章主要介紹了為nuxt項目寫一個面包屑cli工具實現(xiàn)自動生成頁面與面包屑配置,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-09-09
  • Node.js中的HTTP?Server對象與GET、POST請求

    Node.js中的HTTP?Server對象與GET、POST請求

    這篇文章介紹了Node.js中的HTTP?Server對象與GET、POST請求,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07

最新評論