文章目录

  • node:jwt、拦截器
  • nodemon
  • jwt
  • 拦截器
  • 项目部署-hash
  • 项目部署-history

node:jwt、拦截器

nodemon

  • 每次修改代码后都需要手动重启服务?
  • cnpm i -S nodemon
  • nodemon-每次保存时自动重启
  • nodemon main.js --exec babel-node 使用babel-node执行
  • 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 (负载),第三段为signature(签名)
  • header: 定义token类型和签名算法,只做base64
  • payload: 保存一些不敏感用户信息,如用户名, 只做base64
  • sign: 签名,header+payload+secret(加盐) 一起签名算法加密 生成加密字符串
  • secret:相当于自己私有的钥匙(很长的字符串64) secret在服务端(私有)
  • 以上知道jwt如何生成, 验证jwt是不是有效(通过secret解密)
  • cnpm i -S jsonwebtoken
  • 服务端一旦生成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("调用用户登录接口开始"+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//权限let checkPermission = (req, res, next)=>{logger.info("权限检查。。。")//若是跨域请求  首先会有一个试探请求 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过期');// 得到过期时间  若半小时以内 可以刷新token 即不需要重登录let time = ((new Date().getTime()-err.expiredAt.getTime())/(1000*60)).toFixed(2)if (time<=30){logger.info('生成新的token返回前端'); //与登录一样 前端要用新token//根据code返回新token, 前端拿到新token再次发请求res.send({"code":"10001", "token":"xxxxxx"});}}else if (err.name === 'JsonWebTokenError'){logger.error('token无效');}} else {logger.info(JSON.stringify(decoded))req.user = decoded; //将解密的数据保存在user属性中next();}})} else {logger.info("没有token,无效请求")res.send({"msg":"没有token,无效请求"})}}app.use(checkPermission)//合同//把路由配置在myexpress实例上app.use('/api', router);
}

项目部署-hash

windows服务器上部署:

  • 前端打包npm run build生成打包目录dist, 把dist目录放入http服务器访问
  • npm i -g serve http服务 也可使用nginx,见文章:https://blog.csdn.net/hhhmonkey/article/details/119333875
  • serve dist
  • 后端启动 先安装依赖cnpm i 启动npm run start
  • 代码上传ftp

linux服务器:

  • 代码上传ftp+xshell xshell可以在终端上上传文件 yum install
  • 用xhell连接服务器
  • 启动后端 先安装依赖 要创建一个sh文件 添加命令:nohup npm run start & 在后端永久运行

  • 添加执行权限 sudo chmod +x start.sh

    查看是否启动,用搜索语句grep
  • 前端部署 解压dist目录,创建一个sh文件 文件内容: nohup serve dist & 前端若要修改端口可查看npm官网的serve文档
  • 服务器还需要开放端口

常用命令
ls 显示当前目录内容
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'))); //指定页面位置

  • 只需要启动一个服务即可 npm run start
  • 原理: http://localhost:5003/loan-input/index—重定向http://localhost:5003/—
    系统检查到loan-input/index就跳转到对应的模块了

node:jwt、拦截器-学习笔记相关推荐

  1. C4D 内置渲染器 学习笔记

    C4D 内置渲染器 学习笔记 一.渲染到图片查看器 交互式区域渲染 这里可以调节渲染画质 创建动画预览 预览模式:硬件预览 图像尺寸可以大一些,这里渲染很快 二.渲染设置 选择渲染器 输出视频 保存 ...

  2. 0.0 Introduction-机器学习笔记-斯坦福吴恩达教授

    斯坦福学习笔记 本书为斯坦福吴恩达教授的在 coursera 上的机器学习公开课的知识笔记,涵盖了大部分课上涉及到的知识点和内容,因为篇幅有限,部分公式的推导没有记录在案,但推荐大家还是在草稿本上演算 ...

  3. 云笔记项目-过滤器与拦截器学习

    在做云笔记项目的过程中,没有登录的情况下,也可以直接访问edit.html页面.这个跟以前自己用Servlet做过的PadAndFilterManagement情况类似,当时在没有登录的情况下可以访问 ...

  4. 【前端】-【node.js基础】-学习笔记

    [前端]-[node.js]-学习笔记 1 node.js介绍 1.1 node.js优点 1.2 node.js 不足之处 1.3 nodejs与java的区别 2. node中函数 3. 浏览器和 ...

  5. SpringBoot项目使用JWT+拦截器实现token验证

    利用token进行用户身份验证 流程 客户端使用用户名和密码请求登录 服务端收到登录请求,验证用户名和密码 验证成功后,服务端会签发一个token,再把这个token返回给客户端 客户端收到token ...

  6. springmvc 拦截器_Spring MVC拦截器学习

    1 介绍 Spring Web MVC是基于Servlet API构建的原始Web框架. 2 拦截器 2.1 定义 springmvc框架的一种拦截机制 2.2 使用 2.2.1 两步走 实现Hand ...

  7. Struts2 拦截器技术笔记

    java里的拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action执行前阻止其执行,同时也提供了一种可以提取Action ...

  8. sklearn-机器学习笔记

    文章目录 教程 环境配置 Anaconda和Jupyter 更换pip源 机器学习概述 1.1 人工智能概述 1.1.2 机器学习.深度学习能做些什么 1.2 什么是机器学习 1.2.3 数据集构成 ...

  9. Python装饰器学习笔记

    Python装饰器 文章目录 Python装饰器 基本概念 从零开始的逐步分析 修饰后的问题 向被包装后的函数传递参数 使用场景:stdout日志 接受参数的装饰器 作为一个类的装饰器 总结 学习资料 ...

最新文章

  1. python笔试编程题_python_编程面试题
  2. 子菜单挤压下方块元素_小心上瘾!全新类型的消除游戏|《土耳其方块》
  3. The Unsolvable Problem
  4. java设计模式模式组合_Java设计模式---组合模式
  5. Java开源框架集(全)
  6. android auto能用酷狗,完美支持Android车载设备,酷狗音乐pad版使用教程
  7. LINUX查看IP 网关 DNS
  8. ios 模拟器沙盒_ios 模拟器沙盒的位置 | 学步园
  9. ecshop模板支持php,ecshop模板不支持引入PHP语句的解决方法
  10. 乐吾乐2D可视化为智慧水务可视化赋能(二)
  11. 对郭天祥老师的一些知识点的解读
  12. 欧拉筛(线性筛)超级详解 - Python3实现
  13. 空间计量 python_空间计量经济学与Stata实现
  14. 2019年软件评测师真题精选
  15. 通过xmail构建本地电子邮件测试环境
  16. 转载 PCIe学习(三):PCIe DMA关键模块分析之二
  17. thinkphp vue后台管理系统模板_vueadmin 基于vue-admin-template+thinkphp5的后台权限管理系统...
  18. 清除文档菜单中的历史记录
  19. FileZilla设置个人文件夹
  20. 关于电机双闭环PID控制一些理解

热门文章

  1. 08.update_by_query操作
  2. PAT甲级 -- 1007 Maximum Subsequence Sum (25 分)
  3. 【解析】基础实验4-2.5 关于堆的判断 (25 分)
  4. jQuery.ready() 函数详解
  5. 【终极办法】import javax.servlet cannot be resolved 异常全面分析、解决
  6. java replaceall删除中括号和内容_「技术文章」《阿里巴巴 Java 开发手册》精华摘要...
  7. 图片链接生成器软件_推荐10个小众但是黑科技十足的Windows软件
  8. Here Document和Expect概述(免交互,变量设定,控制,注释,)(shell里使用EOF报错)
  9. LeetCode题库第888题 公平的糖果棒交换
  10. 点击打印出现IE已经阻止此站点用不安全方式使用 ActiveX 控件解决方