当前位置: 首页 > news >正文

找人做网站注意什么问题实时新闻

找人做网站注意什么问题,实时新闻,网站建设客户确认单,腰椎间盘突出压迫神经腿疼怎么治疗无感刷新 无感刷新Token技术是一种用于实现持久登录体验的关键技术,它通过在用户登录后自动刷新Token,以延长用户的登录状态,避免频繁要求用户重新登录。 实现 使用access_token(短效token)和refresh_token&#xf…

无感刷新

无感刷新Token技术是一种用于实现持久登录体验的关键技术,它通过在用户登录后自动刷新Token,以延长用户的登录状态,避免频繁要求用户重新登录。

实现

使用access_token(短效token)和refresh_token(长效token),当请求拦截判断属于access_token过期时,使用refresh_token获取一组新的token,并且将所有无效请求入队列,等拿到有效token时依次出队列重新请求。

后端

使用nestjs写了几个测试用的接口

controller.ts

import { Body, Query, Controller,Request, Get, Post, BadRequestException, Inject, Req, UnauthorizedException } from '@nestjs/common';
import { AppService } from './app.service';
import { UserDto } from './dto/user.dto';
import { JwtService } from "@nestjs/jwt"
const users = [{ username:"admin", password:"admin" },{ username:"zhangsan", password:"123" },
]@Controller()
export class AppController {constructor(private readonly appService: AppService) {}@Inject(JwtService)private jwtService:JwtService;@Get()getHello(): string {return this.appService.getHello();}@Post('login')login(@Body() userDto : UserDto){const user = users.find(item => item.username === userDto.username);if(!user) {throw new BadRequestException('用户不存在');}if(user.password !== userDto.password) {throw new BadRequestException("密码错误");}const accessToken = this.jwtService.sign({username:user.username,}, {expiresIn: '0.001h'})const refreshToken =  this.jwtService.sign({username:user.username,}, {expiresIn: '7d'})return {userInfo: {username: user.username,},accessToken: accessToken,refreshToken: refreshToken};}@Get("aaa")aaa(@Req() req: Request){const authorization = req.headers['authorization'];if(!authorization){throw new UnauthorizedException("用户未登录")}try {const token = authorization;const data = this.jwtService.verify(token);console.log(data);return 'aaa'} catch (error) {throw new UnauthorizedException("token失效,请重新登录")}}@Get("bbb")bbb(@Req() req: Request){const authorization = req.headers['authorization'];if(!authorization){throw new UnauthorizedException("用户未登录")}try {const token = authorization;const data = this.jwtService.verify(token);console.log(data);return 'bbb'} catch (error) {throw new UnauthorizedException("token失效,请重新登录")}}@Get('refresh')refresh(@Query('token') token: string) {try{const data = this.jwtService.verify(token);const user = users.find(item => item.username === data.username);const accessToken = this.jwtService.sign({username: user.username,}, {expiresIn: '0.001h'});const refreshToken = this.jwtService.sign({username: user.username}, {expiresIn: '7d'})return {accessToken,refreshToken};} catch(e) {throw new UnauthorizedException('token 失效,请重新登录');}}}

其中login生成 access_token 和 refresh_token

前端请求封装

import axios from 'axios';
import { userStore } from "@/store/user.js"
const store = userStore();
class RequestQueue {constructor() {this.queue = [];this.isRefresh = false;}// 入队enqueue(value) {return this.queue.push(value);}// 出队dequeue() {return this.queue.shift();}// 取队头元素peek() {return this.queue[0];}// 判断队列是否为空isEmpty() {return this.queue.length === 0;}// 取队列有多少个元素size() {return this.queue.length;}// 清空队列clear() {this.queue = [];}setIsRefresh(isRefresh){return this.isRefresh = isRefresh}
}
//1. 创建axios对象
const service = axios.create({baseURL: import.meta.env.VITE_APP_BASE_API,// 超时timeout: 10000});
//2. 请求拦截器
service.interceptors.request.use(config => {console.log('store拦截信息',store)if(store.accessToken){config.headers.Authorization = store.accessToken;}return config;
}, error => {Promise.reject(error);
});let requests = new RequestQueue;  // 请求队列
//3. 响应拦截器
service.interceptors.response.use(response => {//判断code码return response.data;
},error => {if(error.response.status == 401){// token过期处理// 请求入队requests.enqueue(error.response.config);if(!requests.isRefresh){requests.setIsRefresh(true)store.doRefreshToken().then(res=>{while(!requests.isEmpty()){let config = requests.dequeue()config.Authorization = store.accessTokenservice.request(config)}requests.setIsRefresh(false)});}} else {// token请求没有过期return new Promise((resolve,reject)=>{reject(error)});}
});
export default service;
http://www.ds6.com.cn/news/23089.html

相关文章:

  • wordpress数据表开头苏州首页关键词优化
  • 如何在企业版社保网站做增员海南快速seo排名优化
  • 网站一年费用网页制作模板
  • 文件上传到沧州建设局网站肇庆seo按天计费
  • 实施网站推广的最终目的国外引流推广平台
  • 阿里云ecs建网站seo搜外
  • 如何用国外网站做头条网站怎么做收录
  • 做网站怎样设置搜索引擎长沙网红打卡景点排行榜
  • 网站开发是什么语言推广网
  • 谁有那种手机网站徐州百度seo排名
  • 重庆网站建设近重庆零臻科技谈谈对seo的理解
  • 做网站是什么工作免费的客户资源怎么找
  • 网上有做衣服的网站百度网站的网址是什么
  • 建设网站分几个步骤网络项目怎么推广
  • 沭阳做网站公司排名前十怎样在百度上发布信息
  • 影视怎么建设网站关于进一步优化 广州
  • 做的好点的外贸网站小红书推广方案
  • 如何快速建设自适应网站seo关键词排名优化评价
  • 江苏苏州网站建设手机优化大师官方版
  • 网站公司怎么做html网页制作代码大全
  • 网址大全2345 下载这?安卓手机游戏优化器
  • 做影视网站如何通过备案品牌推广活动策划案例
  • 常州做沙滩旗的公司网站企业培训心得体会
  • 做美女视频网站seo站长平台
  • 网站建设微信公众号文章seo外链推广员
  • 为网站做推广时事新闻
  • 那种软件可以做视频网站磁力神器
  • 产品摄影网站企业seo关键词优化
  • 域名绑了小程序还可以做网站吗网络营销是干什么的
  • 网站模板 chinaz广州seo关键词