js的静态资源报401怎么处理?
项目vue2,然后接口那边已经做了统一处理,报401会给个弹窗然后确认会让用户重新登录
但是静态资源比如图片,过了一天也过期了,然后我看console那边是报401,有什么统一处理的方法也可以像接口报错那样统一操作
以下回答参考GPT,并由JoseKe整理完成,希望您能采纳:javascript
import axios from 'axios';
import router from '@/router';
axios.interceptors.response.use(undefined, (error) => {
if (error.response.status === 401) { // 判断是否为401的响应
// 处理操作
router.push('/login'); // 导航至登录页面
}
return Promise.reject(error);
});
引用chatGPT作答,当静态资源(如图片)请求返回 401 未授权的 HTTP 状态码时,这表示请求需要进行身份验证或访问令牌过期。在这种情况下,可以采取以下方法:
1.使用浏览器缓存
如果静态资源需要进行身份验证,可以考虑在请求静态资源时添加访问令牌,并将令牌存储在浏览器的缓存中。这样,在令牌过期之前,浏览器会自动将令牌添加到请求中,避免返回 401 未授权的状态码。需要注意的是,令牌过期后,仍然需要重新获取并更新浏览器缓存中的令牌。
2.通过拦截器进行处理
在 Vue.js 项目中,可以使用 Axios 拦截器来统一处理 HTTP 请求和响应。在拦截器中,可以检查返回的 HTTP 状态码是否为 401,如果是,则弹出一个提示框让用户重新登录。对于静态资源请求返回 401 的情况,可以使用拦截器在请求时自动添加访问令牌,并在返回 401 时触发重新登录操作。
以下是一个拦截器的示例代码:
import axios from 'axios'
axios.interceptors.request.use(config => {
const token = localStorage.getItem('access_token')
if (token) {
config.headers.Authorization = `Bearer ${token}`
}
return config
}, error => {
return Promise.reject(error)
})
axios.interceptors.response.use(response => {
return response
}, error => {
if (error.response.status === 401) {
// 弹出提示框,让用户重新登录
// ...
}
return Promise.reject(error)
})
在以上代码中,我们使用了 Axios 的请求拦截器,在请求中添加了访问令牌,同时使用响应拦截器来检查返回的 HTTP 状态码是否为 401。如果是,我们可以执行需要的操作,例如弹出提示框让用户重新登录。
这边做的是将小时分为5分钟为一个节点,以当前时间的分钟数为例,请求自定义节点区间的上一个五分钟的数据,**这边需求注意每一个小时的0-5分钟需要处理成上一个小时的55-59分钟,简单的小demo**
下面是封装的一个function
import moment from "moment" //引入插件
let arr = [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 59] ; //自定义的小时为单位的区间
export function checkDate(value) { //value为传入的当前时间的分钟数
let obj = []
for (let index = 0; index < arr.length; index++) {
if (value >= 0 && value <= 5) { //处理每一个小时的 0-5分钟
let lastTime = moment(new Date()).subtract(1, 'hours').get('hours')
obj.push(moment()
.set({ hours: lastTime, minute: "55", second: "00" })
.format("YYYY-MM-DD HH:mm:ss"), moment()
.set({ hours: lastTime, minute: "59", second: "59" })
.format("YYYY-MM-DD HH:mm:ss"))
break;
} else { //其余的正常处理
if (value <= arr[index]) {
obj.push(moment()
.set({ minute: arr[index - 2], second: "00" })
.format("YYYY-MM-DD HH:mm:ss"), moment()
.set({ minute: arr[index - 1], second: "59" })
.format("YYYY-MM-DD HH:mm:ss"))
break;
}
}
}
return obj //得到一个['2020-09-11 19:00:00','2020-09-11 19:05:59'] 可使用return 的数组去操作自己的剩余需求
}
axios拦截器我试了并不能拦截图片这些静态资源呀,怎么都在说axios拦截器啊
看了上面的回答,我快笑死了,处理方式分为两种,第一种,你的图片不是必须登陆才能看到的话,你可以直接让后台开放这个目录,就当静态服务器进行访问。第二种,让后台写一个接口,你通过接口获取图片,然后通过接口请求进行拦截,地址用法和现在的一样。