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

怎么做教育培训网站最新app推广

怎么做教育培训网站,最新app推广,建设银行网站用户名更改,怎样用jsp做网站登录token刷新的方案 方案一#xff1a;后端返回过期时间#xff0c;前端判断token过期时间#xff0c;去调用刷新token的接口 缺点#xff1a;需要后端提供一个token过期时间的字段#xff1b;使用本地时间判断#xff0c;若本地时间被修改#xff0c;本地时间比服务…token刷新的方案    方案一后端返回过期时间前端判断token过期时间去调用刷新token的接口    缺点需要后端提供一个token过期时间的字段使用本地时间判断若本地时间被修改本地时间比服务器时间慢拦截会失败。 方案二写个定时器定时刷新token接口    缺点浪费资源消耗性能不建议采用 方案三在响应拦截器中拦截判断token返回过期后调用刷新token接口⭕推荐使用 token失效后接口返回401  有感刷新 清除token强制跳转回登录页有感知的重新登录拿到新token替换到本地体验不好 ! if (res.code 401 || res.code 493){EIMessage.warning(登录已失效,请重新登录 !)sessionstorage.clear()localstorage .removeitem(token)router.push({ path: /login })return } 无感刷新 使用登录时保存的refresh_token调用另一个接口换回新的token值替换到本地再次完成本次未完成的请求用户无感知 具体步骤 1、首次登录的时候会获取到两个token 一个是平时请求接口正常使用的token过期时间短另一个是专门用于刷新的refresh_token过期时间一般比较长登陆时都存起来 localStorage.setItem(‘refresh_token’,xxx) localStorage.setItem(‘token’, xxx) 2、在响应拦截器中对401状态码引入刷新token的api方法调用 3、替换保存本地新的token 4、headers替换新的token 5、axios再次发起未完成的请求返回promise对象到最开始发起请求的页面 6、如果refresh_token也过期了那就判断是否过期过期了就清除localstorage跳转回登录页面   登陆时拿到的后端数据 存起来 refreshToken.js import request from ./requestexport function refreshToken() {const resp request.get(/refresh_token, {headers: {token: ${refresh_token}},__isRefreshToken: true})// return resp.code 0 // 等于0表示刷新token成功 }export function isRefreshRequest(config) {return !!config.__isRefreshToken //两个取反变成boolean }request.js import axios from axios import { refreshToken, isRefreshRequest } form ./refreshToken.js// 创建axios实例 const service axios.create({// baseURL: ,// 所有的请求地址前缀部分timeout: 25000, // 请求超时时间(毫秒)withCredentials: true// 异步请求携带cookie })// 请求拦截器 service.interceptors.request.use((config: any) {... }, error {... })// 响应拦截器 service.interceptors.response.use((response: any) {let res response.dataif (res.code 401 !isRefreshRequest(res.config)){ // 如果没有权限且不是刷新token的请求// 刷新tokentry {const res await refreshToken()// 保存新的tokenlocalStorage.setItem(token, res.data.token)// 有新token后再重新请求response.config.headers.token localStorage.getItem(token) // 新tokenconst resp await service.request(response.config)return resp.data// return service(response.config)}catch {localStorage.clear() // 清除tokenrouter.replace(/login) // 跳转到登录页}} }, error {...console.log(error, error)return Promise.reject(error) })问题一如何防止多次刷新token 为了防止多次刷新token可以通过一个变量isRefreshing 去控制是否在刷新token的状态 request.js import axios from axios import { refreshToken, isRefreshRequest } form ./refreshToken.js// 创建axios实例 const service axios.create({// baseURL: ,// 所有的请求地址前缀部分timeout: 25000, // 请求超时时间(毫秒)withCredentials: true// 异步请求携带cookie })// 请求拦截器 service.interceptors.request.use((config: any) {... }, error {... })// 响应拦截器 service.interceptors.response.use((response: any) {let res response.datalet isRefreshing falseif (res.code 401 ! isRefreshRequest(res.config)){ // 如果没有权限且不是刷新token的请求if (!isRefreshing) {isRefreshing true// 刷新tokentry {const res await refreshToken()// 保存新的tokenlocalStorage.setItem(token, res.data.token)// 有新token后再重新请求response.config.headers.token localStorage.getItem(token) // 新tokenconst resp await service.request(response.config)return resp.data// return service(response.config)}catch {localStorage.clear() // 清除tokenrouter.replace(/login) // 跳转到登录页}isRefreshing false}} }, error {...console.log(error, error)return Promise.reject(error) })问题二同时发起两个或者两个以上的请求时怎么刷新token 当第二个过期的请求进来token正在刷新我们先将这个请求存到一个数组队列中想办法让这个请求处于等待中一直等到刷新token后再逐个重试清空请求队列。 那么如何做到让这个请求处于等待中呢 为了解决这个问题我们得借助Promise。将请求存进队列中后同时返回一个Promise让这个Promise一直处于Pending状态即不调用resolve此时这个请求就会一直等啊等只要我们不执行resolve这个请求就会一直在等待。当刷新请求的接口返回来后我们再调用resolve逐个重试。 request.js import axios from axios import { refreshToken, isRefreshRequest } form ./refreshToken.js// 创建axios实例 const service axios.create({// baseURL: ,// 所有的请求地址前缀部分timeout: 25000, // 请求超时时间(毫秒)withCredentials: true// 异步请求携带cookie })// 请求拦截器 service.interceptors.request.use((config: any) {... }, error {... })// 响应拦截器 service.interceptors.response.use((response: any) {let res response.datalet isRefreshing falselet requests [] // 请求队列if (res.code 401 isRefreshRequest(res.config)){ // 如果没有权限且不是刷新token的请求if (!isRefreshing) {isRefreshing true// 刷新tokentry {const res await refreshToken()// 保存新的tokenlocalStorage.setItem(token, res.data.token)// 有新token后再重新请求response.config.headers.token localStorage.getItem(token) // 新token// token 刷新后将数组的方法重新执行requests.forEach((cb) cb(token))requests [] // 重新请求完清空const resp await service.request(response.config)return resp.data// return service(response.config)}catch {localStorage.clear() // 清除tokenrouter.replace(/login) // 跳转到登录页}isRefreshing false} else {// 返回未执行 resolve 的 Promisereturn new Promise(resolve {// 用函数形式将 resolve 存入等待刷新后再执行request.push(token {response.config.headers.token ${token}resolve(service(response.config))})})}} }, error {...console.log(error, error)return Promise.reject(error) })
http://www.zqtcl.cn/news/86016/

相关文章:

  • 只做水果的网站沈阳快速建站模板
  • 成都山而网站建设公司加盟招商网站建设方案
  • 一个网站开发小组烫画图案设计网站
  • 本公司经营网站建设南充建设企业网站
  • 效果图网站有哪些视频网站怎么制作
  • 网站建设的参考书籍有哪些做平面设计好的网站有哪些
  • 淮南医院网站建设邢台有几个县
  • 知名中文网站建设wordpress调用帖子
  • 布朗新风 中企动力提供网站建设建站平台 phpwind
  • 如何建设公司的网站营销型网站重要性
  • 揭西网站建设做爰网站视屏
  • 河北住房和城乡建设厅网站电话wordpress占用带宽
  • 免费推广网站在线广州 网站开发 骏域
  • 肥西县住房和城乡建设局网站网页设计公司金华
  • 网站建设公司小江信息展示网站
  • 动漫做暧视频网站重庆璧山网站制作公司推荐
  • 重庆建设机电有限公司网站无锡百姓网推广代理商
  • 哪个网站学做凉皮做网站时如何建立栅格
  • 做通信毕业设计的网站wordpress建站收录快
  • 连云港做网站推广wordpress插件如何应用
  • excel做网站大连做网站建设
  • dede网站入侵温州快速网站建设排名
  • 网站 手机 微信 appwordpress设置代理
  • 丹东商城网站建设如何制作一个个人网站
  • 国内十大网站排名wordpress主题自定义打不开
  • 昆明网站建设哪家最好坪地网站建设价位
  • 建设网站收费标准怎么选择五屏网站建设
  • 怎么做网站的寄生套餐
  • 网站的整体风格成都广告公司制作
  • uc官网网站开发者中心网站开发计划书封面设计