接口、会话控制

文章目录

    • 接口
      • 介绍
      • RESTful API
      • json-server
      • 接口测试工具
        • apipost公共参数和文档功能
  • 会话控制
    • cookie
      • 介绍和使用
      • 运行流程
      • 浏览器中操作Cookie
      • express中cookie操作
    • Session
      • session运行流程:
      • session中间件配置
      • session 和 cookie 的区别
      • CSRF跨站请求伪造
    • token
      • JWT介绍与演示
      • 获取当前用户信息

接口

介绍

接口是前后端通信的桥梁
简单理解:一个接口就是服务中的一个路由规则,根据请求响应结果

接口的英文单词是API(Application Program Interface),所以有时也称之为API接口。
这里的接口指的是[数据接口],与编程语言(Java, Go等)中的接口语法不同

接口的作用:实现前后端通信

接口的开发与调用 大多数接口都是由后端工程师开发的,开发语言不限
一般情况下接口都是由前端工程师调用的,但有时后端工程师也会调用接口,比如短信接口,支付接口等

接口的组成一个接口一般由如下几个部分组成:
请求方法、接口地址(URL)、
请求参数、响应结果

基本说明:

RESTful API

RESTful API是一种特殊风格的接口,主要特点有如下几个:

  • URL中的路径表示资源,路径中不能有动词,例如create,delete,update等这些都不能有
  • 操作资源要与HTTP请求方法对应
  • 操作结果要与HTTP响应状态码对应:

在这里插入图片描述

json-server

json-server本身是一个JS编写的工具包,可以快速搭建RESTfulAPI服务,前端应用就可以调用,快速实现前端功能
官方地址:https://github.com/typicode/json-server

操作步骤:
1.全局安装json-server

npm i -g json-server

2.创建JSON文件(db.json),编写基本结构

{"song":[{"id":1,"name":"干杯","singer":"五月天"},{"id":2,"name":"当","singer":"动力火车"},{"id":3,"name":"不能说的秘密","singer":"周杰伦"]
}

3.以JSON文件所在文件夹作为工作目录,执行如下命令

json-server --watch db.json

默认监听端口为3000

接口测试工具

测试的前提是json-server已经启动
几个接口测试工具:
apipost:https://www.apipost.cn/(中文)
apifox:https://www.apifox.cn/(中文)
postman:https://www.postman.com/(英文)

apipost公共参数和文档功能

比如在请求体内加一个auth的公共参数
1.新建一个文件夹,把接口全放进去
2.点击文件夹设置需要的公共设置后保存
在这里插入图片描述
文档功能:分享项目,打开地址就可以看到文档,方便前端工程师调用文档
在这里插入图片描述
在项目里给客户端返回结果时的数据一般是json格式的

/* 记账本列表 */
router.get("/account", function (req, res, next) {AccountModel.find().sort({ time: -1 }).then((data) => {// 响应成功提醒res.json({// 响应编号code:'0000',//一般0表示成功,非0表示失败// 响应的信息msg:'读取成功',// 响应的数据data:data});}).catch((err) => {res.json({code:'1001',msg:'读取失败',data:null})});
});

会话控制

会话控制就是对会进行控制
把数据发给对应的用户

HTTP是一种无状态的协议,它没有办法区分多次的请求是否来自于同一个客户端,无法区分用户而产品中又大量存在的这样的需求,所以我们需要通过会话控制来解决该问题

常见的会话控制技术有三种:cookie、session、token

cookie

介绍和使用

  • cookie是HTTP服务器发送到用户浏览器并保存在本地的一小块数据
  • cookie是保存在浏览器端的一小块数据
  • cookie 是按照域名划分保存的

简示例:
在这里插入图片描述

浏览器向服务器发送请求时,会自动将当前域名下可用的cookie设置在请求头中,然后传递给服务器

这个请求头的名字也叫cookie,所以将cookie理解为一个HTTP的请求头也是可以的

运行流程

账号信息传递给服务器,服务器再把对应的cookie返回(返回时是通过响应报文传递的),浏览器解析响应报文set-cookie 存储数据,并把数据保存在当前域名下面
在这里插入图片描述
在这里插入图片描述

浏览器中操作Cookie

使用较少,了解即可
不同的浏览器的Cookie是不共享的
1.禁用所有cookie:在浏览器的设置里直接搜索cookie => Cookie及其他网站数据
2.删除:在浏览器的设置里直接搜索cookie => 查看数据和权限
在这里插入图片描述
3.查看Cookie:Edge浏览器的设置里直接搜索cookie => 管理和删除cookie和站点数据 => 查看所有。。
谷歌浏览器:点击链接左侧的锁 => Cookie查看

express中cookie操作

1.设置cookie
设置生命周期为1分钟,每次访问页面1分钟后就会自动清除set-cookie报文
在这里插入图片描述
2.删除cookie

res.clearCookie('name');

3.读取cookie
提取报文里的cookie
1).安装:npm i cookie-parser用于解析cookie
2).引入文件、中间件(具体查询API文档)

const express=require('express');
// 2.导入cookie-parser
const cookieParser=require('cookie-parser');
const app=express();
// 3.使用
app.use(cookieParser())
// 设置cookie
app.get('/set-cookie',(req,res)=>{res.cookie('name','zhangsan');res.cookie('them','blue');res.send('home');
});
// 删除
app.get('/remove-cookie',(req,res)=>{res.cookie('name');res.send('删除');
});
// 获取
app.get('/get-cookie',(req,res)=>{console.log(req.cookies);res.send(`欢迎您${req.cookies.name}`);
});
app.listen(3000,()=>{console.log('服务器已经启动,端口3000');
})

Session

session是保存在服务器端的一块儿数据,保存当前访问用户的相关信息

session的作用:实现会话控制,可以识别用户的身份,快速获取当前用户的相关信息

session运行流程:

填写账号和密码校验身份,
校验通过后创建session信息,
session_id的值通过响应头返回给浏览器
在这里插入图片描述

有了cookie,下次发送请求时会自动携带cookie,服务器通过cookie中的session_id 的值确定用户的身份
在这里插入图片描述

session中间件配置

express 中可以使用 express-session 对 session 进行操作

1.安装包:
npm i express-session connect-mongo

const express = require('express');
//2. 引入 express-session connect-mongo
const session = require("express-session");
const MongoStore = require('connect-mongo');
const app = express();
//3. 设置 session 的中间件
app.use(session({name: 'sid', //设置cookie的name,默认值是:connect.sidsecret: 'atguigu', //参与加密的字符串(又称签名)saveUninitialized: false, //是否为每次请求都设置一个cookie用来存储session的idresave: true, //是否在每次请求时重新保存sessionstore: MongoStore.create({mongoUrl: 'mongodb://127.0.0.1:27017/project' //数据库的连接配置}),cookie: {httpOnly: true, // 开启后前端无法通过 JS 操作maxAge: 1000 * 300 // 这一条 是控制 sessionID 的过期时间的!!!},
}))
//创建 session
app.get('/login', (req, res) => {
//设置sessionreq.session.username = 'zhangsan';req.session.email = 'zhangsan@qq.com'res.send('登录成功');
})
//获取 session
app.get('/home', (req, res) => {console.log('session的信息');console.log(req.session.username);if (req.session.username) {res.send(`你好 ${req.session.username}`);}else{res.send('登录 注册');}
})
//销毁 session
app.get('/logout', (req, res) => {
//销毁session
// res.send('设置session');req.session.destroy(() => {res.send('成功退出');});
});
app.listen(3000, () => {console.log('服务已经启动, 端口 ' + 3000 + ' 监听中...');
})

session 和 cookie 的区别

  1. 存在的位置
    cookie:浏览器端
    session:服务端
  2. 安全性
    cookie 是以明文的方式存放在客户端的,安全性相对较低
    session 存放于服务器中,所以安全性 相对 较好
  3. 网络传输量
    cookie 设置内容过多会增大报文体积, 会影响传输效率
    session 数据存储在服务器,只是通过 cookie 传递 id,所以不影响传输效率
  4. 存储限制
    浏览器限制单个 cookie 保存的数据不能超过 4K ,且单个域名下的存储数量也有限制
    session 数据存储在服务器中,所以没有这些限制

CSRF跨站请求伪造

记账本案例logout是退出登录页面
在这里插入图片描述

// 退出登陆
router.get('/logout',(req,res)=>{// 销毁sessionreq.session.destroy(()=>{res.render('success',{msg: "退出成功",url:"/login"});})
})

在访问attack页面的时候,会在记账本页面退出登陆
在这里插入图片描述
A网站向B网站发送请求会把cookie带上
问题解决:
把退出登录的路由规则换成post
在网页中发送post请求需要表单

<form method="post" action="/logout"><button class="btn btn-danger">退出登陆</button>
</form>
// 退出登陆
router.post('/logout',(req,res)=>{// 销毁sessionreq.session.destroy(()=>{res.render('success',{msg: "退出成功",url:"/login"});})
})

原因:link、script等标签在加载的时候也会发请求(发的请求都是get请求,不是post)

token

token 是服务端生成并返回给 HTTP 客户端的一串加密字符串, token 中保存着 用户信息

token 的作用:
实现会话控制,可以识别用户的身份,主要用于移动端 APP

token 的工作流程:
填写账号和密码校验身份,校验通过后响应 token,token 一般是在响应体中返回给客户端的
在这里插入图片描述
后续发送请求时,需要手动将 token 添加在请求报文中,一般是放在请求头中
在这里插入图片描述

token 的特点

  • 服务端压力更小:数据存储在客户端
  • 相对更安全:数据加密、可以避免 CSRF(跨站请求伪造)(不携带cookie)
  • 扩展性更强
    服务间可以共享(在分布式系统中sessionID无法在不同服务器之间共享,但token可以)
    增加服务节点更简单

JWT介绍与演示

JWT(JSON Web Token )是目前最流行的跨域认证解决方案,可用于基于 token 的身份验证实现会话控制
JWT 使 token 的生成与校验更规范

可以使用 jsonwebtoken 包 来操作 token
下载:npm i jsonwebtoken

//导入 jsonwebtokan
const jwt = require('jsonwebtoken');
//1.创建 token
// jwt.sign(用户数据, 加密字符串, 配置对象)// 创建tokenlet token=jwt.sign({username:data.username,_id:data._id,},secret,{expiresIn:60*60*24*7,}//生命周期 单位是 秒)// 响应tokenres.json({code:'0000',msg:"登陆成功",data:token})
module.exports=(req,res,next)=>{// 获取tokenconst token=req.get('token')if(!token){return res.json({code:'2003',msg:"token缺失",data:null})}// 校验tokenjwt.verify(token,secret,(err,data)=>{if(err){return res.json({code:'2004',msg:"校验失败",data:null})}next();})
}

获取当前用户信息

在记账本案例中,用户多的情况下,在列表读取时只读取当前访问者
往请求对象(token校验时)存储用户数据

// 校验tokenjwt.verify(token,secret,(err,data)=>{if(err){return res.json({code:'2004',msg:"校验失败",data:null})}!!!保存用户数据req.user=data;//校验成功放行请求next();})

后续就可以在列表req.data获取用户id等属性
在这里插入图片描述

扩展阅读:https://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html

附录
6.1 本地域名
所谓本地域名就是 只能在本机使用的域名 ,一般在开发阶段使用

操作流程:

编辑文件 C:\Windows\System32\drivers\etc\hosts
127.0.0.1 www.baidu.com

如果修改失败, 可以修改该文件的权限
在这里插入图片描述

原理:
在地址栏输入 域名 之后,浏览器会先进行 DNS(Domain Name System) 查询,获取该域名对应的 IP 地

请求会发送到 DNS 服务器,可以 根据域名返回 IP 地址
可以通过 ipconfig /all 查看本机的 DNS 服务器
hosts 文件也可以设置域名与 IP 的映射关系,在发送请求前,可以通过该文件获取域名的 IP 地址

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/701000.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux基础之进程-进程状态

目录 一、进程状态 1.1 什么是进程状态 1.2 运行状态 1.2 阻塞状态 1.3 挂起状态 二、Linux操作系统上具体的进程状态 2.1 状态 2.2 R 和 S 状态的查看 2.3 后台进程和前台进程 2.4 休眠状态和深度休眠状态 一、进程状态 1.1 什么是进程状态 首先我们知道我们的操作系…

vue+canvas实现根据数据展示不同高度,不同j渐变颜色的长方体效果

文章目录 不一样的长方体1. 实现效果预览2.实现思路2.1效果难点2.2 实现思路 3.实现3.1 测试数据编写3.2 编写canvas绘制函数 不一样的长方体 1. 实现效果预览 俗话说的好&#xff0c;没有实现不了的页面效果&#xff0c;只有禁锢的思想&#xff0c; 这不ui又给整了个新奇的页…

探索执法部门如何在不依赖面部识别的情况下追踪感兴趣的人

概述 视频证据在犯罪调查中的重要性正日益凸显&#xff0c;其数量之多已经达到了前所未有的水平。据美国司法援助局&#xff08;Bureau of Justice Assistance, BJS&#xff09;的数据显示&#xff0c;大约80%的犯罪案件都涉及到某种形式的视频证据&#xff0c;并且这一比例还…

暗黑4可以搬砖吗?暗黑4怎么搬砖 搬砖攻略

暗黑4可以搬砖吗&#xff1f;暗黑4怎么搬砖 搬砖攻略 暗黑破坏神4属于是暴雪旗下一款经典游戏IP&#xff0c;在全世界有着广泛的玩家群体&#xff0c;更是在今年暴雪国服宣布回归之后&#xff0c;吸引了一大批新玩家加入。今天小编就为大家带来暗黑4的详细搬砖教程。 现在我们…

Notepad8.1.9汉化中文版

下载地址&#xff1a;Notepad8.1.9.zip 一款优秀免费的源代码编辑器&#xff0c;支持语法高亮的开源纯文本编辑器&#xff0c;并且可以替代系统自带的记事本的功能。

Java入门之数据类型和变量

1.字面常量 字面常量就是在程序运行中&#xff0c;固定不变的量&#xff0c;例如如下的代码 public class Demo{public static void main(String[] args){System.Out.println("hello world!");System.Out.println(100);System.Out.println(3.14);System.Out.println…

汇昌联信电商:拼多多网店好做吗?

在电子商务的海洋中&#xff0c;拼多多以其独特的团购模式和亲民策略迅速崛起&#xff0c;吸引了大批消费者和商家的目光。对于“拼多多网店好做吗?”这个问题&#xff0c;答案并非简单的是与否&#xff0c;而是需要从多个维度进行深入分析。 一、市场定位与竞争环境 拼多多定…

免费pr相册模板mogrt|手机壁纸AI绘画摄影作品照片展示模板视频素材

pr相册模板mogrt&#xff0c;手机壁纸、电脑桌面壁纸、AI绘画、摄影作品、照片展示模板视频素材。 Premiere Pro 2023及以上版本。 全高清&#xff08;19201080&#xff09;分辨率/30fps。 通用表达式&#xff08;适用于所有特效语言&#xff09;。 免费下载&#xff1a;https…

Pycharm配置Git以及Gitee实现代码管理(全网最详细)

前言&#xff1a;如果是自己想练手&#xff0c;完全可以用gitee当做代码管理平台&#xff08;gitee注册后就可用&#xff09; 1.环境准备 &#xff08;1&#xff09;需要安装Git&#xff08;在windows&#xff09; &#xff08;2&#xff09;windows下安装Git可参考如下链接…

如何为zencart网站开启debug调试模式

在管理Zencart网站时&#xff0c;调试程序是至关重要的一环。然而&#xff0c;有时候在调试过程中&#xff0c;我们可能会遇到前台界面显示不完整或者出现空白页面的情况。这时候&#xff0c;启用错误提示就成了解决问题的关键。 我是在hostease购买的VPS主机带cPanel面板。 他…

【YashanDB知识库】ycm托管数据库时报错OM host ip:127.0.0.1 is not support join to YCM

问题现象 问题的风险及影响 导致数据库无法托管监控 问题影响的版本 问题发生原因 安装数据库时修改了OM的监听ip为127.0.0.1 解决方法及规避方式 后台修改OM的ip为本机的ip或者0.0.0.0 问题分析和处理过程 1、修改env文件中的om IP地址&#xff0c;修改为0.0.0.0或本机…

CSS的基础语法和常见的语法简单归纳

CSS CSS 是层叠样式表&#xff08;Cascading Style Sheets&#xff09;的缩写。它是一种用来控制网页样式和布局的标记语言。通过 CSS&#xff0c;可以定义网页中的元素&#xff08;如文字、图像、链接等&#xff09;的外观和排版方式&#xff0c;包括字体、颜色、大小、间距、…