node:jwt、拦截器-学习笔记
文章目录
- 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类型和签名算法,只做base64payload
: 保存一些不敏感用户信息,如用户名, 只做base64sign
: 签名,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/119333875serve 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、拦截器-学习笔记相关推荐
- C4D 内置渲染器 学习笔记
C4D 内置渲染器 学习笔记 一.渲染到图片查看器 交互式区域渲染 这里可以调节渲染画质 创建动画预览 预览模式:硬件预览 图像尺寸可以大一些,这里渲染很快 二.渲染设置 选择渲染器 输出视频 保存 ...
- 0.0 Introduction-机器学习笔记-斯坦福吴恩达教授
斯坦福学习笔记 本书为斯坦福吴恩达教授的在 coursera 上的机器学习公开课的知识笔记,涵盖了大部分课上涉及到的知识点和内容,因为篇幅有限,部分公式的推导没有记录在案,但推荐大家还是在草稿本上演算 ...
- 云笔记项目-过滤器与拦截器学习
在做云笔记项目的过程中,没有登录的情况下,也可以直接访问edit.html页面.这个跟以前自己用Servlet做过的PadAndFilterManagement情况类似,当时在没有登录的情况下可以访问 ...
- 【前端】-【node.js基础】-学习笔记
[前端]-[node.js]-学习笔记 1 node.js介绍 1.1 node.js优点 1.2 node.js 不足之处 1.3 nodejs与java的区别 2. node中函数 3. 浏览器和 ...
- SpringBoot项目使用JWT+拦截器实现token验证
利用token进行用户身份验证 流程 客户端使用用户名和密码请求登录 服务端收到登录请求,验证用户名和密码 验证成功后,服务端会签发一个token,再把这个token返回给客户端 客户端收到token ...
- springmvc 拦截器_Spring MVC拦截器学习
1 介绍 Spring Web MVC是基于Servlet API构建的原始Web框架. 2 拦截器 2.1 定义 springmvc框架的一种拦截机制 2.2 使用 2.2.1 两步走 实现Hand ...
- Struts2 拦截器技术笔记
java里的拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action执行前阻止其执行,同时也提供了一种可以提取Action ...
- sklearn-机器学习笔记
文章目录 教程 环境配置 Anaconda和Jupyter 更换pip源 机器学习概述 1.1 人工智能概述 1.1.2 机器学习.深度学习能做些什么 1.2 什么是机器学习 1.2.3 数据集构成 ...
- Python装饰器学习笔记
Python装饰器 文章目录 Python装饰器 基本概念 从零开始的逐步分析 修饰后的问题 向被包装后的函数传递参数 使用场景:stdout日志 接受参数的装饰器 作为一个类的装饰器 总结 学习资料 ...
最新文章
- python笔试编程题_python_编程面试题
- 子菜单挤压下方块元素_小心上瘾!全新类型的消除游戏|《土耳其方块》
- The Unsolvable Problem
- java设计模式模式组合_Java设计模式---组合模式
- Java开源框架集(全)
- android auto能用酷狗,完美支持Android车载设备,酷狗音乐pad版使用教程
- LINUX查看IP 网关 DNS
- ios 模拟器沙盒_ios 模拟器沙盒的位置 | 学步园
- ecshop模板支持php,ecshop模板不支持引入PHP语句的解决方法
- 乐吾乐2D可视化为智慧水务可视化赋能(二)
- 对郭天祥老师的一些知识点的解读
- 欧拉筛(线性筛)超级详解 - Python3实现
- 空间计量 python_空间计量经济学与Stata实现
- 2019年软件评测师真题精选
- 通过xmail构建本地电子邮件测试环境
- 转载 PCIe学习(三):PCIe DMA关键模块分析之二
- thinkphp vue后台管理系统模板_vueadmin 基于vue-admin-template+thinkphp5的后台权限管理系统...
- 清除文档菜单中的历史记录
- FileZilla设置个人文件夹
- 关于电机双闭环PID控制一些理解
热门文章
- 08.update_by_query操作
- PAT甲级 -- 1007 Maximum Subsequence Sum (25 分)
- 【解析】基础实验4-2.5 关于堆的判断 (25 分)
- jQuery.ready() 函数详解
- 【终极办法】import javax.servlet cannot be resolved 异常全面分析、解决
- java replaceall删除中括号和内容_「技术文章」《阿里巴巴 Java 开发手册》精华摘要...
- 图片链接生成器软件_推荐10个小众但是黑科技十足的Windows软件
- Here Document和Expect概述(免交互,变量设定,控制,注释,)(shell里使用EOF报错)
- LeetCode题库第888题 公平的糖果棒交换
- 点击打印出现IE已经阻止此站点用不安全方式使用 ActiveX 控件解决方