日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

node:jwt、拦截器-学习笔记

發(fā)布時間:2024/1/23 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 node:jwt、拦截器-学习笔记 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

    • node:jwt、攔截器
    • nodemon
    • jwt
    • 攔截器
    • 項目部署-hash
    • 項目部署-history

node:jwt、攔截器

nodemon

  • 每次修改代碼后都需要手動重啟服務(wù)?
  • cnpm i -S nodemon
  • nodemon-每次保存時自動重啟
  • nodemon main.js --exec babel-node 使用babel-node執(zhí)行
  • npm run dev2
{"name": "0","version": "1.0.0","description": "","main": "","scripts": {"start": "babel-node main.js","dev": "cross-env PORT=4000 babel-node main.js","dev2": "nodemon main.js --exec babel-node"},"keywords": [],"author": "","license": "ISC","dependencies": {"babel-cli": "^6.26.0","babel-node": "^0.0.1-security","babel-plugin-add-module-exports": "^1.0.2","babel-preset-env": "^1.7.0","body-parser": "^1.19.0","cross-env": "^7.0.2","express": "^4.17.1","jsonwebtoken": "^8.5.1","mysql2": "^2.1.0","nodemon": "^2.0.4","sequelize": "^5.22.2","winston": "^3.3.2"} }

jwt

  • 比如鑰匙
  • 其中第一段為 header(頭),第二段為 payload (負(fù)載),第三段為signature(簽名)
  • header: 定義token類型和簽名算法,只做base64
  • payload: 保存一些不敏感用戶信息,如用戶名, 只做base64
  • sign: 簽名,header+payload+secret(加鹽) 一起簽名算法加密 生成加密字符串
  • secret:相當(dāng)于自己私有的鑰匙(很長的字符串64) secret在服務(wù)端(私有)
  • 以上知道jwt如何生成, 驗證jwt是不是有效(通過secret解密)
  • cnpm i -S jsonwebtoken
  • 服務(wù)端一旦生成jwt token,只能等待它過期

util/constan.js用于放常量

const constant = {secret: "xxxdfsdfsdasdfsdfsdf" //鹽 }export default constant

user.ctrl.js

//用戶控制器 操作用戶的接口 import jwt from 'jsonwebtoken' import constant from '../util/constant' import logger from '../util/logger' import * as userService from '../service/user.service'const operations = {//生成tokengenerateToken(data){return jwt.sign(data, constant.secret, {expiresIn: '60000' //ms 1d---1天})},// 用戶登錄接口login: function(req, res){let {account, password} = req.body;logger.info("調(diào)用用戶登錄接口開始"+account+" "+password)userService.findUser(account, password).then(data=> {if(data){//data中不能有密碼let result = {data:data,msg: "用戶登錄成功"}let jwt = operations.generateToken(result);result.token = jwt;res.status(200).json(result)logger.info("用戶登錄成功")}else{res.status(400).json({"msg":"用戶登錄失敗"})logger.info("用戶登錄失敗")}})}, }export default operations

攔截器

  • 作用:過濾過無效請求,包括沒有jwt,無效的jwt等

my.route.js:

//路由 import jwt from 'jsonwebtoken' import constant from '../util/constant' import express from 'express' import userCtrl from '../controllers/user.ctrl' import logger from '../util/logger';const router = express.Router(); //使用express框架自帶的路由 類比vue-routerexport default function(app){//控制器接口--需要路由 接口請求方式(get post)//接口定義請求方式: get post delete put//用戶 路由地址 請求方式 控制器接口router.route('/user/list-page').post(userCtrl.listPage);router.route('/user/create').post(userCtrl.createUser);router.route('/user/update').post(userCtrl.updateUser);router.route('/user/delete/:id').post(userCtrl.deleteUser);router.route('/user/query').get(userCtrl.query);router.route('/user/list').get(userCtrl.list);router.route('/user/login').post(userCtrl.login);// /api/user/login//權(quán)限let checkPermission = (req, res, next)=>{logger.info("權(quán)限檢查。。。")//若是跨域請求 首先會有一個試探請求 OPTIONSif (req.method === 'OPTIONS'){res.send({"msg":"ok"})} else if (req.originalUrl === '/api/user/login'){//登錄不限制next();} else if (req.headers.hasOwnProperty('token')){//驗證tokenlogger.info("token 驗證", req.headers.token)//驗證 合法 有效jwt.verify(req.headers.token, constant.secret, function(err, decoded){if (err) {//logger.error(err); //無效 剛過期(刷新token)if (err.name === 'TokenExpiredError') { //過期logger.error('token過期');// 得到過期時間 若半小時以內(nèi) 可以刷新token 即不需要重登錄let time = ((new Date().getTime()-err.expiredAt.getTime())/(1000*60)).toFixed(2)if (time<=30){logger.info('生成新的token返回前端'); //與登錄一樣 前端要用新token//根據(jù)code返回新token, 前端拿到新token再次發(fā)請求res.send({"code":"10001", "token":"xxxxxx"});}}else if (err.name === 'JsonWebTokenError'){logger.error('token無效');}} else {logger.info(JSON.stringify(decoded))req.user = decoded; //將解密的數(shù)據(jù)保存在user屬性中next();}})} else {logger.info("沒有token,無效請求")res.send({"msg":"沒有token,無效請求"})}}app.use(checkPermission)//合同//把路由配置在myexpress實例上app.use('/api', router); }

項目部署-hash

windows服務(wù)器上部署:

  • 前端打包npm run build生成打包目錄dist, 把dist目錄放入http服務(wù)器訪問
  • npm i -g serve http服務(wù) 也可使用nginx,見文章:https://blog.csdn.net/hhhmonkey/article/details/119333875
  • serve dist
  • 后端啟動 先安裝依賴cnpm i 啟動npm run start
  • 代碼上傳ftp

linux服務(wù)器:

  • 代碼上傳ftp+xshell xshell可以在終端上上傳文件 yum install
  • 用xhell連接服務(wù)器
  • 啟動后端 先安裝依賴 要創(chuàng)建一個sh文件 添加命令:nohup npm run start & 在后端永久運行

  • 添加執(zhí)行權(quán)限 sudo chmod +x start.sh

    查看是否啟動,用搜索語句grep
  • 前端部署 解壓dist目錄,創(chuàng)建一個sh文件 文件內(nèi)容: nohup serve dist & 前端若要修改端口可查看npm官網(wǎng)的serve文檔
  • 服務(wù)器還需要開放端口

常用命令
ls 顯示當(dāng)前目錄內(nèi)容
cd 切換目錄
ps 查看進程
vim 編輯文本
搜索進程:ps -ef|grep node

項目部署-history

  • 打包npm run build
  • 安裝插件connect-history-api-fallback
  • 在myexpress.js中配置插件
app.use(history()); app.use(express.static(path.join(__dirname, '../dist'))); //指定頁面位置

  • 只需要啟動一個服務(wù)即可 npm run start
  • 原理: http://localhost:5003/loan-input/index—重定向http://localhost:5003/—
    系統(tǒng)檢查到loan-input/index就跳轉(zhuǎn)到對應(yīng)的模塊了

總結(jié)

以上是生活随笔為你收集整理的node:jwt、拦截器-学习笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。