js的静态资源报401怎么处理?

js的静态资源报401怎么处理?

项目vue2,然后接口那边已经做了统一处理,报401会给个弹窗然后确认会让用户重新登录

但是静态资源比如图片,过了一天也过期了,然后我看console那边是报401,有什么统一处理的方法也可以像接口报错那样统一操作

以下回答参考GPT,并由JoseKe整理完成,希望您能采纳:
在前后端分离的项目中,静态资源是存在于前端文件中的,通常会放在 public/static 文件夹中。一般情况下,静态资源请求不会验证用户身份,因此出现401错误可能是因为服务器对静态资源进行了身份验证而导致的。此时,可以在前端进行统一处理来解决问题。

在 Vue 项目中,可以使用 Axios 库来发送请求,利用 axios.interceptors.response 对响应结果进行拦截和处理。实现如下:

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);
});


因为是对静态资源进行拦截,所以需要对所有资源的请求都进行拦截处理。同时,处理的操作也应该是跳转至登录页面,让用户重新登录获取授权,保证资源请求的正确性。需注意的是,此操作只适用于前端请求出现401的情况,若后台访问的资源存在身份验证,还需要后端进行相应处理。

引用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。如果是,我们可以执行需要的操作,例如弹出提示框让用户重新登录。

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7685363
  • 这篇博客你也可以参考下:vue禁止浏览器记住密码:使用文本输入框作为密码控件,将输入字符自动转换为*星号,避开浏览器提示保存明文密码的功能,输入框可键入删除复制粘贴替换。Vue、JS
  • 除此之外, 这篇博客: js处理以小时为单位的时间间隔(vue)中的 项目中可能会有一种定时的请求数据,比如以分钟数为节点,去请求自定定义的时间间隔的数据,可以自己手动去设置的时间间隔的起止时间,在配合定时器去请求接口。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 这边做的是将小时分为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 的数组去操作自己的剩余需求
    }
    

img

axios拦截器我试了并不能拦截图片这些静态资源呀,怎么都在说axios拦截器啊

看了上面的回答,我快笑死了,处理方式分为两种,第一种,你的图片不是必须登陆才能看到的话,你可以直接让后台开放这个目录,就当静态服务器进行访问。第二种,让后台写一个接口,你通过接口获取图片,然后通过接口请求进行拦截,地址用法和现在的一样。