Vue中的请求拦截器和响应拦截器用法及说明
作者:小白在线学前端
vue请求拦截器和响应拦截器用法
今天就讲一下什么是请求拦截器,和请求拦截器的作用,好了,多余的话我就不说了,马上开始今天的讲解
开始啦
请求拦截器
请求拦截器的作用是:
在请求发送前进行一些操作,例如在每个请求体里面加上token
,统一做了处理的,如果要更改也是非常的容易。
关于拦截
这里只说原理,前端的请求,最终离不开Ajax,像Vue的Vue-Resource
、Axios,都只是对Ajax进行了统一的封装,它暴露出来的拦截器,其实就是写了一个方法,把Ajax写在这个方法里面(我们先说请求拦截器),在执行的时候,先将请求时要添加给请求头的那些数据(Token、后端要的加密的密码)先执行一遍,都赋值给一个变量,然后再统一传给Ajax,接下来,就是执行Ajax,这就是所谓的请求拦截器,其实就是先执行要添加的数据,然后再执行Ajax,如果把这个添加数据的过程抽出来,就成了所谓的请求拦截器了
// 请求超时时间 axios.defaults.timeout = 120000 // 添加请求拦截器 axios.interceptors.request.use( config => { // 在发送请求之前做些什么 // 判断是否存在token,如果存在将每个页面header都添加token if (window.sessionStorage.getItem('DT')) { // 请求头配置全局token config.headers.DT = window.sessionStorage.getItem('DT') } return config }, err => { // 对请求错误做些什么 Vue.prototype.$message.error('请求超时') return Promise.reject(err) } )
响应拦截器
响应拦截器的作用就是
在接收到响应后再进行一些操作,例如在服务器返回登录状态失效的时候,需要重登录,跳转到登录页面,
响应拦截器,就是是在请求结果的返回后的同时,先不直接导出,而是先对响应码等等的进行处理,处理好之后再导出给页面,如果将这个对象响应码的处理过程抽出来,就成了所谓的响应拦截器
代码如下
// 响应拦截器 axios.interceptors.response.use( response => { // res是响应的结果 switch (response.data.code) { case 401: // 登录失效 // 响应成功的拦截 console.log('响应拦截器:') // console.log(response.data) Vue.prototype.$message.error(response.data.message) sessionStorage.removeItem('DT') router.push('/login') break case 404: if (response.data.message !== null) { Vue.prototype.$message.error(response.data.message) } else { Vue.prototype.$message.error('未知错误') } break case 500: // 错误 if (response.data.message !== null) { Vue.prototype.$message.error(response.data.message) } else { Vue.prototype.$message.error('未知错误') } break default: return response } return response }, err => { if (err.response.data.message) { Vue.prototype.$message.error(err.response.data.message) return Promise.reject(err.response.data.message) // 返回接口返回的错误信息 } else { // 返回状态码不为200时候的错误处理 Vue.prototype.$message.error(err.toString()) return Promise.resolve(err) } } )
页面中请求接口时:
// 用户登录提交 login() { // debugger this.$refs.loginFormRef.validate(async valid => { if (!valid) return if (valid) {const userInfo = { username: this.loginForm.username, password: this.loginForm.password } // 登录之前去除token window.sessionStorage.removeItem('DT') const { data: res } = await this.$http.post('/system/login', userInfo) if (res.code !== 200) { this.initCaptcha() return } this.$message.success('登录成功') window.sessionStorage.setItem('DT', res.result.token) this.$router.push('/main') } }) }
心得:
- 请求拦截器:其实就是先执行要添加的数据,然后再执行Ajax,如果把这个添加数据的过程抽出来,就成了所谓的请求拦截器了
- 响应拦截器:就是是在请求结果的返回后的同时,先不直接导出,而是先对响应码等等的进行处理,处理好之后再导出给页面,如果将这个对象响应码的处理过程抽出来,就成了所谓的响应拦截器
使用axios请求拦截器和响应拦截器
在使用一些前后端会话时,需要在请求头中携带一些特殊请求头,这样,就需要设置请求拦截器和响应拦截器
开发项目时,由于后端使用了token令牌,登录后在前端保存,然后每次请求都要携带token,将这些配置写在main.js文件中是很乱的不易于阅读,额外配置了axios请求配置模块 这样在以后对于请求响应都能更好的配置而不会影响其他配置
如果不使用请求拦截,那么对每一条请求每一个状态都要特殊处理,如果请求特殊状态有数十个,每个页面有很多请求,那么页面会变得很长很臃肿,不好维护。
如何使用?
1.在utils文件夹中创建 一个request.js文件
文件内容为(这里必须export这个配置后,才能被):
const service = axios.create({ timeout: 6000 //请求超时为6秒 }); //创建一个axios, 命名为service
2.先写请求拦截器的逻辑代码
//请求拦截器 service.interceptors.request.use(function(config) { // 处理请求之前的配置 //在请求头headers加入token校验 config.headers["token"] = "aded434088c7bcc595ec1c36c24aea1c" return config }, function(error) { // 请求失败的处理 return Promise.reject(error); });
3.接着写响应拦截器的逻辑代码
service.interceptors.response.use(function (response) { // 在接收响应做些什么,例如跳转到登录页 ...... return response; }, function (error) { // 对响应错误做点什么 return Promise.reject(error); });
4.在统一管理的接口文件api.js使用
5.移除拦截器的方法
axios.interceptors.request.eject(service); //service为第一步中创建的axios
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。