<强> 1。写在前面强>
最近在学习Vue2,遇到有些页面请求数据需要用户登录权限,服务器响应不符预期的问题,但是总不能每个页面都做单独处理吧,于是想到axios提供了拦截器这个好东西,再于是就出现了本文。
<强> 2。具体需求强>
-
<李>用户鉴权与重定向:使用Vue提供的路由导航钩子李>
<李>请求数据序列化:使用axios提供的请求拦截器李>
<李>接口报错信息处理:使用axios提供的响应拦截器李>
<强> 3。简单实现强>
3.1路由导航钩子层面鉴权与重定向的封装
路由导航钩子所有配置均在路由器/index.js这里是部分代码
从“Vue”进口Vue 从“vue-router”进口路由器 从“进口{getUserData} @/脚本/localUserData” const MyAddress=r=比;要求。确保([],()=比;r(要求(@/视图/MyAddress/MyAddress)),“MyAddress”) Vue.use(路由器) const路线=[ { 路径:/资料/地址, 名称:“MyAddress”, 组件:MyAddress, 元:{ 标题:“我的地址”, requireAuth:真 } },//更多… ] const路由器=new路由器({ 模式:“历史”, 路线 }) >之前我们主要来看下面逻辑处理部分的代码
让indexScrollTop=0 路由器。beforeEach(下),从=比;{//路由进入下一个路由对象前,判断是否需要登陆//在路由元对象中由个requireAuth字段,只要此字段为真的,必须做鉴权处理 如果(to.matched。一些(res=比;res.meta.requireAuth)) {//用户数据为存储在本地的一些用户信息 让用户数据=https://www.yisu.com/zixun/getUserData ()//未登录和已经登录的处理//getUserData方法处理后如果userData.token没有值就是未定义的,下面直接判断 如果(用户数据。令牌===未定义){//执行到此处说明没有登录,君可按需处理之后再执行如下方法去登录页面//我这里没有其他处理,直接去了登录页面 下一个({ 路径:/登录, 查询:{ 重定向:to.path } }) 其他}{//执行到说明本地存储有用户信息//但是用户信息是否过期还是需要验证一下滴 让overdueTime=userData.overdueTime 让nowTime=+新的日期//登陆过期和未过期 如果(nowTime比;overdueTime) {//登录过期的处理,君可按需处理之后再执行如下方法去登录页面//我这里没有其他处理,直接去了登录页面 下一个({ 路径:/登录, 查询:{ 重定向:to.path } }) 其他}{ next () } } 其他}{ next () } 如果()。路径!=='/'){ indexScrollTop=document.body.scrollTop } 文档。标题=to.meta。标题| | document.title }) 路由器。afterEach(路线=比;{ 如果路线。路径!=='/'){ document.body。scrollTop=0 其他}{ Vue.nextTick(()=比;{ document.body。scrollTop=indexScrollTop }) } }) 出口的默认路由器 >之前至此,路由钩子层面的鉴权处理完毕,不过细心的你可能注意到:导航去登录页面调用接下来的方法里面有个查询对象,携带了目标路由的地址,这是因为在登录成功后我们需要重定向到目标页面。
3.2对axios拦截器封装
axios所有配置均在件脚本/getData.js文件,这里是本文件公共代码部分
' ' ' 从“qs”进口qs 从“进口{getUserData} @/脚本/localUserData” 从“@/路由器”进口路由器 从“axios”进口axios 从“进口{AJAX_URL} @/config/指数” axios.defaults.baseURL=AJAX_URL 比;axios请求拦截器代码 ' ' '/* * *请求拦截器,请求发送之前做些事情 */axios.interceptors.request.use ( 配置=比;{//发布| |把| |删除请求时先格式化数据数据//这里需要引入第三方模块qs 如果( config.method.toLocaleUpperCase ()===癙OST”| | config.method.toLocaleUpperCase()==='把' | | config.method.toLocaleUpperCase()==='删除' ) { 配置。data=https://www.yisu.com/zixun/qs.stringify (config.data) }//配置授权参数携带用户令牌 让用户数据=getUserData () 如果(userData.token) { config.headers。授权=userData.token } 返回配置 }, 错误=> {//此处应为弹窗显示具体错误信息,因为是练手项目,劣者省略此处//君可自行写| |引入第三方UI框架 console.error(错误) 返回Promise.reject(错误) } )详解给Vue2路由导航钩子和axios拦截器做个封装