token的本地存储--请求拦截器(vue项目)

1、由于token是后端发送过来的一个唯一身份标识,在一次登录后想要在下次打开网页时自动登录上去,就需要把这个token存储在本地,在挂载的时候浏览器拿着这个token去向服务器发生请求,获取用户信息

下面的代码就是把在本地vuex里面放的token通过放在请求头的方式带过去保存起来。每次发起请求的时候就会带上这个请求头的token,后台通过判断这个token进行相应相应的数据

 可以看见发的请求里面确实带了token参数

2、 在登录的时候把token进行持久化保留处理(注意:vuex每次刷新里面的数据就会消失,所以通过这种方式保留)

 

3、下面是vuex仓库里面的三连环【获取用户信息的】

(导入api请求:后台写好的进行调用;state进行拿取token操作,在登录的时候token被保存在本地,然后state直接获取,所以一开始是空的)

 (actions方法:获取用户的数据)

 在相应的组件里面替换信息

<think>我们正在使用vue-admin-template项目,并需要配置axios请求拦截器。根据引用[2],我们知道在vue-admin-template中已经使用了axios进行数据请求(开发环境)。通常,我们会创建一个axios实例,并在该实例上添加拦截器。步骤:1.找到项目中初始化axios的地方。在vue-admin-template中,通常会在`src/utils/request.js`中创建axios实例并配置拦截器。2.如果没有该文件,我们可以创建一个,并在其中配置拦截器,然后在需要的地方引入这个实例。根据引用[3]和[4],项目结构遵守一定的规范。我们会在src目录下进行操作。具体实现:在`src/utils/request.js`中(如果不存在则新建),我们可以编写如下代码:```javascriptimportaxiosfrom'axios'//创建axios实例constservice=axios.create({baseURL:process.env.VUE_APP_BASE_API,//根据环境变量设置基础URL,在.env文件中配置timeout:5000//请求超时时间})//请求拦截器service.interceptors.request.use(config=>{//在发送请求之前可以做些什么//例如,如果项目使用token,则可以从store中获取token并添加到请求头//假设我们将token存储在localStorage中,键为'token'consttoken=localStorage.getItem('token')if(token){config.headers['Authorization']=`Bearer${token}`}returnconfig},error=>{//对请求错误做些什么console.log(error)//fordebugreturnPromise.reject(error)})//响应拦截器service.interceptors.response.use(response=>{//对响应数据做点什么constres=response.data//这里可以根据后端返回的状态码进行判断,比如状态码不是20000,则认为是错误if(res.code!==20000){//可以弹出一个错误提示console.error('请求错误:',res.message||'Error')returnPromise.reject(newError(res.message||'Error'))}else{returnres}},error=>{//对响应错误做点什么console.log('err'+error)//fordebugreturnPromise.reject(error)})exportdefaultservice```然后,在项目中需要发起请求的地方,我们不再直接使用axios,而是使用这个封装好的service。例如,在API模块中(通常放在`src/api`目录下):```javascriptimportrequestfrom'@/utils/request'exportfunctiongetInfo(token){returnrequest({url:'/user/info',method:'get',params:{token}})}```这样,每次请求都会经过请求拦截器和响应拦截器。另外,根据引用[4],我们注意到项目可能会使用mock数据。在请求拦截器中,我们也可以根据环境变量判断是否使用mock,但通常mock是在开发环境中通过引用mock文件(如引用[4]中的代码)来实现的,所以拦截器中不需要特别处理。注意事项:-请求拦截器中,我们通常添加认证信息(如token)到请求头。-在响应拦截器中,我们根据后端返回的数据结构进行统一处理,例如处理错误状态码。如果vue-admin-template已经有一个`request.js`文件,并且已经配置了拦截器,那么我们可以直接修改该文件,添加我们需要的逻辑。最后,确保在`main.js`中引入的axios实例是我们封装好的这个,但通常在api模块中引入,所以不需要在main.js中全局引入。引用:-关于axios的配置和代理设置(引用[2])已经在vue.config.js中配置了跨域代理,这与拦截器是独立的,不会冲突。-项目结构规范(引用[3])指导我们在views中写页面,而api模块则放在src/api目录。因此,按照以上步骤即可实现axios请求拦截器。</think> 基于 `vue-admin-template` 实现 Axios 请求拦截器的完整配置步骤如下: ### 1. **定位 Axios 实例文件** 在 `src/utils/` 目录中找到 `request.js` 文件。这是封装 Axios 的核心文件,所有网络请求都通过这个文件发出。 ### 2. **配置请求拦截器** 在 `request.js` 中添加请求拦截逻辑: ```javascript // src/utils/request.js import axios from 'axios' // 创建 axios 实例 const service = axios.create({ baseURL: process.env.VUE_APP_BASE_API, // 基础 URL timeout: 5000 // 超时时间 }) // ========= 请求拦截器 ========= service.interceptors.request.use( config => { // 在发送请求前统一处理 // 示例1:添加认证 token const token = localStorage.getItem('token') if (token) { config.headers['Authorization'] = `Bearer ${token}` } // 示例2:转换 POST 数据格式 if (config.method === 'post') { config.data = JSON.stringify(config.data) config.headers['Content-Type'] = 'application/json' } return config // 必须返回处理后的配置 }, error => { return Promise.reject(error) // 处理错误 } ) export default service ``` ### 3. **配置响应拦截器**(可选) 在同一个文件中添加响应拦截逻辑: ```javascript // ========= 响应拦截器 ========= service.interceptors.response.use( response => { // 对响应数据统一处理 const res = response.data // 示例:根据业务状态码处理 if (res.code !== 20000) { // 20000 是 vue-admin-template 默认的成功码 alert(`请求错误: ${res.message}`) return Promise.reject(new Error(res.message)) } return res }, error => { // 统一处理 HTTP 错误状态码 if (error.response.status === 401) { router.push('/login') // token 过期跳转登录 } return Promise.reject(error) } ) ``` ### 4. **跨域代理配置**(如需要) 在 `vue.config.js` 中配置代理(开发环境)[^2]: ```javascript // vue.config.js module.exports = { devServer: { proxy: { '/api': { target: 'http://your-api-domain.com', // 后端地址 changeOrigin: true, pathRewrite: { '^/api': '' // 去除请求路径中的 /api } } } } } ``` ### 5. **启用 Mock 数据**(如需要) 在 `main.js` 中添加动态 Mock 支持[^4]: ```javascript // main.js if (process.env.NODE_ENV === 'development' && process.env.MOCK === 'true') { require('./mock') // 加载 mock/index.js } ``` ### 使用示例 在 API 模块中直接使用封装好的请求: ```javascript // src/api/user.js import request from '@/utils/request' export function login(data) { return request({ url: '/api/login', // 会被代理规则处理 method: 'post', data }) } ``` ### 关键说明 1. **拦截器执行顺序**: ```mermaid graph LR A[请求发起] --> B(请求拦截器) --> C[服务器] C --> D(响应拦截器) --> E[业务代码] ``` 2. **内容类型处理**: - 默认使用 `application/x-www-form-urlencoded` - 通过拦截器可自动转换为 `application/json` 3. **环境变量**: - `.env.development` 中设置 `VUE_APP_BASE_API` - `.env.production` 中设置生产环境 API 地址
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值