接口以及会话控制

接口

接口是前后端交互通信的桥梁

简单理解:一个接口就是服务中的一个路由规划,根据请求响应结果

接口的英文单词是API(Application Program Interface),所以有时也称之为API接口

这里的接口指的是数据接口,与编程语言(java,Go等)中的接口语法不同

 接口的作用

实现前后端交互

接口的开发与调用

大多数接口都是由后端工程师开发的,开发语言不限

一般情况下接口都是由前端工程师调用的,但有时后端工程师也会调用接口,比如短信接口,支付接口等

接口的组成

一个接口一般由如下几个部分组成

  • 请求方法
  • 接口地址(url)
  • 请求参数
  • 响应结果

RESTful API

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

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

json-server

json-server本身是一个JS编写的工具包,可以快速搭建RESTful API服务

官方地址:https://github.com/typicode/json-server

操作步骤:

全局安装json-server

npm i -g json-server

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

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

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

json-server --watch db.json

 

接口测试工具

介绍几个接口测试工具

 160_接口测试工具-apipost公共参数与文档功能_哔哩哔哩_bilibili

161_接口测试工具-postman基本使用_哔哩哔哩_bilibili

成功或失败时返回json数据  res.json({code:'0000',msg:'创建成功',data:'data'})

会话控制介绍

介绍

所谓会话控制就是对会话进行控制

HTTP是一种无状态的协议,他没有办法区分多次的请求是否来自于同一个客户端,无法区别用户

而产品中又大量存在这样的需求,多以我们需要通过会话控制来解决该问题

常见的会话控制技术有三种:

  • cookie

cookie是HTTP服务器发送到用户浏览器并保存在本地的一小块数据

cookie是保存在浏览器端的一小块数据

cookie是按照域名划分保存的

 

  • 域名cookie
    www,baidu.coma=100;b=200
    www.bilibili.comxid=1020abce121;hm=112411213
    jd.comx=100;ocw=12414cce

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

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

cookie的运行流程

填写账号和密码校验身份,校验通过后下发cookie

 有了cookie之后,后续向服务器发送请求时,就会自动携带cookie

浏览器中操作Cookie

 171_会话控制_express框架中设置cookie_哔哩哔哩_bilibili170_会话控制_浏览器操作cookie_哔哩哔哩_bilibili

express框架中设置cookie

在路由规则中添加res.cookie('name','zhangsan'),在用户请求成功之后返回cookie,会在浏览器关闭的时候销毁

res.cookie('name','zhangsan',{maxAge:60*1000})

// 导入express
const express=require('express')
const cookieParser=require('cookie-parser')
// 创建应用对象
const app=express()
app.use(cookieParser())
// 创建路由规则
app.get('/set-cookie',(req,res)=>{
  // res.cookie('name','zhangsan')//会在浏览器关闭的时候销毁
  res.cookie('name','zhangsan',{maxAge:60*1000})
  res.cookie('theme','blue')
  res.send('home')

})
// 删除cookie
app.get('/remove-cookie',(req,res)=>{
  // 调用方法
  res.clearCookie('name')
  res.send('删除成功~~')
})
// 提取cookie,先下载cookie-parser包
app.get('/get-cookie',(req,res)=>{
  // 获取cookie
  console.log(req.cookies)
  res.send('获取cookie')
})
app.listen(3000,()=>{
  console.log('3000端口启动中')
})
  • session

  • session是保存在服务器端的一块数据,保存当前访问用户的信息
  • session可实现会话控制,可以识别用户的身份,快速获取当前用户的相关信息
  • 运行流程

填写账号和密码校验身份,校验通过后创建session信息,然后将session_id的值通过响应头返回给浏览器

有了cookie,下次发送请求时会自动携带cookie,服务器通过cookie中的session_id的值确定用户的身份

express中使用session

const express=require('express')
const session=require('express-session')
const MongoStore=require('connect-mongo')
// 创建应用对象
const app=express()
// 设置session的中间件
app.use(session({
  name:'sid',//设置cookie的name,默认值是connect.sid
  secret:'atguigu',//参与加密的字符串(又称签名)
  saveUninitialized:false,//是否为每次请求都设置一个cookie用来存储session的id
  resave:true,//是否在每次请求时重新保存session
  store:MongoStore.creat({
    mongoUrl:'mongodb://127.0.0.1:27027/project'//数据库的连接配置
  }),
  cookie:{
    httpOnly:true,//开启后前端无法通过JS操作
    maxAge:1000*300//这一条是控制sessionID的过期时间的
  }
}))
// 首页路由
app.get('/',(req,res)=>{
  res.send('home')
})
// 登录
app.get('/login',(req,res)=>{
  // username=admin&password=admin
  if(req.query.username==='admin'&&req.query.password==='admin'){
    // 设置session信息
    req.session.username='admin'
    req.session.uid='258aefccc'
    res.send('登陆成功')
  }else{
    res.send('登陆失败')
  }

})
// session的读取
app.get('/cart',(req,res)=>{
  // 检测session是否存在用户数据
  if(req.session.username){
    req.send(`购物车页面,欢迎您${req.session.username}`)
  }else{
    res.send('您还没有登录~~')
  }
})
// 启动服务
app.listen(3000)

session和cookie的区别

 存在的位置

  • cookie:浏览器端
  • session:服务端

安全性

  • cookie是以明文的方式存储在客户端的,安全性相对较低
  • session存放于服务器中,所以安全性相对较好

网络传输量

  • cookie设置内容过多会增大报文体积,会影响传输效率
  • session数据存储在服务器,只是通过cookie传递id,所以不影响传输效率

存储限制

  • 浏览器限制单个cookie保存的数据不能超过4k,且单个域名下的存储数量也有限制
  • session数据存储在服务器中,所以没有这些限制

  • token

  • token是服务端生成并返回给HTTP客户端的遗传加密字符串,token中保存着用户信息
  • token可以实现会话控制,可以识别用户的身份,主要用于移动端APP
  • token工作流程:

填写账号和密码校验身份,校验通过后响应token,token一般是在响应体中返回给客户端的

 

后续发送请求时,需要手动将token添加在请求报文中,一般是放在请求头中

 

特点: 

  • 服务端压力更小,数据存储在客户端
  • 相对更安全,数据加密,可以避免CSRF(跨域请求伪造)
  • 扩展性更强,服务间可以共享,增加服务节点更简单

  JWT 

JWT是目前最流行的跨域认证解决方案,可用于基本token的身份验证

JWT使token生成与校验更规范

我们可以使用jsonwebtoken包来操作token

// 导入jwt
const jwt=require('jsonwebtoken')
// 创建生成token
// let token=jwt.sign(用户数据,加密字符串,配置对象)
let token=jwt.sign({
  username:'zhangsan'
},'atguigu',{
  expiresIn:300//token的声明周期,单位是秒
})
console.log(token)
// 校验token
let t='eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InpoYW5nc2FuIiwiaWF0IjoxNzE3MzMwNDA3LCJleHAiOjE3MTczMzA3MDd9.b8u73NBwGYYCjly9EgwYKURWVrNLa8HVUKksqhJObdc'
jwt.verify(t,'atguigu',(err,data)=>{
  if(err){
    console.log('校验失败')
    return
  }
  console.log(data)
})

  • 8
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值