接口、会话控制

文章目录

    • 接口
      • 介绍
      • 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.sid
	secret: 'atguigu', //参与加密的字符串(又称签名)
	saveUninitialized: false, //是否为每次请求都设置一个cookie用来存储session的id
	resave: true, //是否在每次请求时重新保存session
	store: MongoStore.create({
	mongoUrl: 'mongodb://127.0.0.1:27017/project' //数据库的连接配置
	}),
	cookie: {
		httpOnly: true, // 开启后前端无法通过 JS 操作
		maxAge: 1000 * 300 // 这一条 是控制 sessionID 的过期时间的!!!
	},
}))
//创建 session
app.get('/login', (req, res) => {
//设置session
	req.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)=>{
    // 销毁session
    req.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)=>{
    // 销毁session
    req.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(用户数据, 加密字符串, 配置对象)
	// 创建token
        let token=jwt.sign(
            {
            username:data.username,
            _id:data._id,
            },
            secret,
            {expiresIn:60*60*24*7,}//生命周期 单位是 秒
        )
     // 响应token
        res.json({
            code:'0000',
            msg:"登陆成功",
            data:token
        })
module.exports=(req,res,next)=>{
      // 获取token
  const token=req.get('token')
  if(!token){
    return res.json({
      code:'2003',
      msg:"token缺失",
      data:null
    })
  }
  // 校验token
  jwt.verify(token,secret,(err,data)=>{
    if(err){
      return res.json({
        code:'2004',
        msg:"校验失败",
        data:null
      })
    }
    next();
  })
}

获取当前用户信息

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

// 校验token
  jwt.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 地址

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript的综合案例

案例要求&#xff1a; 实现一个表单验证 1.当输入框失去焦点时&#xff0c;验证输入的内容是否符合要求 2.当点击注册按钮时&#xff0c;判断所有输入框的内容是否都符合要求&#xff0c;如果不符合要求阻止表单提交 简单的页面实现 <!DOCTYPE html> <html lang&…

【IDE】com.intellij.debugger.engine.evaluation.EvaluateException

目录标题 报错重现代码分析解决方式 报错重现 Error during generated code invocation com.intellij.debugger.engine.evaluation.EvaluateException: Method threw java.lang.NullPointerException exception.代码分析 //ls来自上下文 ls.stream().map(m->m.getRewardTy…

tarjan学习

1.割点&#xff08;必须经过&#xff09;&#xff1a;当时&#xff0c;y是一个割点&#xff0c;x是y的一个子节点&#xff0c;当没有点x时&#xff0c;y无法访问其他点 2.割边&#xff08;必须经过&#xff09;&#xff1a;当时&#xff0c;y不经过这条边无法到达x&#xff0c…

深入了解 npm:Node.js 包管理工具详解

文章目录 一、npm 基本概念1.1 什么是 npm&#xff1f;1.2 package.json 文件 二、npm 常用命令2.1 初始化项目2.2 安装依赖2.2.1 安装单个包2.2.2 全局安装包2.2.3 安装开发依赖 2.3 移除依赖2.4 更新依赖2.5 查看已安装的包2.6 发布包 三、npm 高级用法3.1 使用 npm scripts3…

嵌入式学习-M4的基本定时器

基本介绍 框图分析 时钟选择 计数器结构 开启重装载值寄存器的影子寄存器的工作时序图 未开启重装载值寄存器的影子寄存器的工作时序图 更新事件以及中断 相关寄存器 相关库函数

RK3566(泰山派):GP7101背光驱动

RK3566&#xff08;泰山派&#xff09;&#xff1a;GP7101背光驱动 文章目录 RK3566&#xff08;泰山派&#xff09;&#xff1a;GP7101背光驱动GP7101背光驱动电路配置i2c1设备树创建驱动编写Makefilegp7101_bl.c驱动触摸I2C驱动框架。驱动中的结构体probe函数devm_backlight_…

探索数据结构:堆的具体实现与应用

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;数据结构与算法 贝蒂的主页&#xff1a;Betty’s blog 1. 堆的概念 堆(Heap)是计算机科学中一类特殊的数据结构。堆通常是一个…

SpringBoot项目的项目部署全过程

一、前端 安装nginx 1.将提前准备好的nginx的安装包上传到Linux中/opt目录下(我用的是Xftp) 2.解压 2.1:在xshell中解压该文件: tar -zxvf nginx-1.20.1.tar.gz 2.2:进入解压后的目录 cd nginx-1.20.1/ 2.3:安装需要的依赖 yum -y install zlib zlib-devel openssl openssl-de…

Keil编程不同驱动文件引用同一个常量的处理方法

基础不牢&#xff0c;地动山摇&#xff0c;最近单片机编程又遇到一个基础问题。 我在头文件中定义了一个常量同时给两个驱动文件使用&#xff0c;封装的时候编译没问题&#xff0c;但是在main函数中引用驱动函数的时候就出现了重定义的问题&#xff0c;如下如所示。 解决方法很…

8.基于鱼鹰优化算法(OOA)优化VMD参数(OOA-VMD)

代码原理 鱼鹰优化算法&#xff08;Osprey Optimization Algorithm, OOA&#xff09;是一种基于仿生学原理的启发式优化算法&#xff0c;它模拟了鱼鹰觅食的行为&#xff0c;通过调整搜索空间中的个体位置来优化目标函数。 鱼鹰优化算法可参考&#xff1a;鱼鹰优化算法(Ospre…

Network Compression

听课&#xff08;李宏毅老师的&#xff09;笔记&#xff0c;方便梳理框架&#xff0c;以作复习之用。本节课主要讲了Network Compression&#xff0c;包括为什么要压缩&#xff0c;压缩的主要手段&#xff08;pruning,knowledge distillation,parameter quantization,architect…

C# 下载安装,使用OfficeOpenXml

下载安装OfficeOpenXml模块 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Reflection.Emit; using System.Text; using System.Text.RegularEx…

【大道至简】官方兼容到android13+的获取系统屏幕高度, statusbar,navBar

android在屏幕高度和app高度&#xff0c;statusbar, navigationbar的高度处理上&#xff0c;迭代了好多版本。 android11&#xff0c; android12都有新的api和过时的api标记。 涉及的api类似如下&#xff1a; windowManager&#xff0c;defaultDisplay, Context.display, Deco…

uniapp开发安卓app使用文字转语音技术

在 UniApp 开发安卓应用时&#xff0c;要实现文字转语音&#xff08;Text-to-Speech, TTS&#xff09;技术&#xff0c;你可以利用 UniApp 的跨平台能力结合原生模块或第三方服务来实现。以下是一些建议的步骤和方法&#xff1a; 1. 使用 UniApp 原生模块&#xff08;如果支持…

怎么得到所有大写字母/小写字母组成的字符串

有时候&#xff0c;可能需要获取a~z、A~Z组成的26个字母的字符串&#xff0c;这篇文章介绍一种简单的方法。 只需要几句简单到不能再简单的代码&#xff01;你不会还在傻傻地一个个字母敲吧~ /*** author heyunlin* version 1.0*/ public class Example {/*** 小写字母*/priv…

通信指挥类装备(多链路聚合设备)-应急通信指挥解决方案

现场通信指挥系统是一种功能全面的便携式音视频融合指挥通信平台&#xff0c;可实现现场应急救援指挥、多种通信手段融合、现场通信组网等功能&#xff0c;是现场指挥系统的延伸。 多链路聚合设备&#xff0c;是一款通信指挥类装备&#xff0c;具有 4G/5G&#xff0c;专网&…

ResNeXt

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊# 前言 前言 前面已经学习了resnet家族已经inception卷积网络&#xff0c;还简单了解了SE注意力机制&#xff0c;今天学习resnet和inception的组合ResNeXt。 …

Nodejs笔记2

模块化 模块化初体验 模块暴露数据 导入模块 fs 写绝对路径 require写相对路径不会受到影响 ./../不能省略 js 和json文件后缀可以省略 如果存在 命名相同的js和json文件&#xff0c;优先导入js文件 导入文件夹时的情况 require导入模块的基本流程 commonJS模块…

Nginx的正向代理与反向代理

你好呀&#xff0c;我是赵兴晨&#xff0c;文科程序员。 今天&#xff0c;我们将一起了解什么是Nginx的正向代理&#xff1f;什么是Nginx的反向代理&#xff1f;并实际动手实践。 以下内容都是满满的干货&#xff0c;绝对不容错过。我建议先收藏这篇文章&#xff0c;然后找一…

前端CSS3基础1(新增长度单位,盒子模型,背景,边框,文本属性,渐变,字体,2D变换,3D变换)

前端CSS3基础1&#xff08;新增长度单位&#xff0c;盒子模型&#xff0c;背景&#xff0c;边框&#xff0c;文本属性&#xff0c;渐变&#xff0c;字体&#xff0c;2D变换&#xff0c;3D变换&#xff09; CSS3 新增长度单位CSS3 新增盒子模型相关属性box-sizing怪异盒模型box-…