Procházet zdrojové kódy

登录状态已过期问题解决

Rockery před 3 roky
rodič
revize
525e4d0759
1 změnil soubory, kde provedl 70 přidání a 65 odebrání
  1. 70 65
      h5_web/common/http.interceptor.js

+ 70 - 65
h5_web/common/http.interceptor.js

@@ -1,71 +1,76 @@
-import { config } from '@/common/config.js';
-import store  from '../store/index.js'
+import {
+  config
+} from '@/common/config.js';
+import store from '../store/index.js'
+
 // 这里的vm,就是我们在vue文件里面的this,所以我们能在这里获取vuex的变量,比如存放在里面的token
 // 同时,我们也可以在此使用getApp().globalData,如果你把token放在getApp().globalData的话,也是可以使用的
 const install = (Vue, vm) => {
-	Vue.prototype.$u.http.setConfig({
-		baseUrl: config.baseUrl,
-		// 如果将此值设置为true,拦截回调中将会返回服务端返回的所有数据response,而不是response.data
-		// 设置为true后,就需要在this.$u.http.interceptor.response进行多一次的判断,请打印查看具体值
-		// originalData: true, 
-		// 设置自定义头部content-type
-		// header: {
-		// 	'content-type': 'xxx'
-		// }
-	});
-	// 请求拦截,配置Token等参数
-	Vue.prototype.$u.http.interceptor.request = (config) => {
-		// config.header.Token = 'xxxxxx';
-		// 方式一,存放在vuex的token,假设使用了uView封装的vuex方式,见:https://uviewui.com/components/globalVariable.html
-		// config.header.token = vm.vuex_token;
-		
-		if(vm.vuex_token){config.header.Authorization = `Bearer ${vm.vuex_token}`;}
-		
-		// 方式二,如果没有使用uView封装的vuex方法,那么需要使用$store.state获取
-		// config.header.token = vm.$store.state.token;
-		
-		// 方式三,如果token放在了globalData,通过getApp().globalData获取
-		// config.header.token = getApp().globalData.username;
-		
-		// 方式四,如果token放在了Storage本地存储中,拦截是每次请求都执行的,所以哪怕您重新登录修改了Storage,下一次的请求将会是最新值
-		// const token = uni.getStorageSync('token');
-		// config.header.token = token;
-		// url加时间戳
-		config.url = config.url + '?t=' + Date.now()
-		// 此url参数为this.$u.get(url)中的url值
-		let noTokenList = ['/wechat/h5/user','/client/auth/verifyCode'];
-		if(noTokenList.includes(config.url)) config.header.noToken = true;
-		// console.log('noTokenList.includes(config.url)',noTokenList.includes(config.url));
-		// console.log('config.url',config.url);
-		return config; 
-	}
-	// 响应拦截,判断状态码是否通过
-	Vue.prototype.$u.http.interceptor.response = (res) => {
-		// 如果把originalData设置为了true,这里得到将会是服务器返回的所有的原始数据
-		// 判断可能变成了res.statueCode,或者res.data.code之类的,请打印查看结果
-		// console.log('interceptor res',res);
-		if(res.code == 200) {
-			// 如果把originalData设置为了true,这里return回什么,this.$u.post的then回调中就会得到什么
-			return res;  
-		} else if(res.msg == "令牌不能为空" || res.code == 401){
-			const backUrl = location.href
-			const loginUrl = 'phoneLogin'
-			if (backUrl.indexOf(loginUrl) > 0) {
-				// localStorage.clear()
-			} else {
-				localStorage.setItem('backUrl', location.href)
-				// this.$u.vuex('vuex_hasLogin', false);
-				alert('还未登录,即将跳转登录');
-				uni.navigateTo({
-					url: "/pages/phoneLogin/phoneLogin"
-				});
-				return
-			}
-			
-		}else return res;
-	}
+  Vue.prototype.$u.http.setConfig({
+    baseUrl: config.baseUrl,
+    // 如果将此值设置为true,拦截回调中将会返回服务端返回的所有数据response,而不是response.data
+    // 设置为true后,就需要在this.$u.http.interceptor.response进行多一次的判断,请打印查看具体值
+    // originalData: true, 
+    // 设置自定义头部content-type
+    // header: {
+    // 	'content-type': 'xxx'
+    // }
+  });
+  // 请求拦截,配置Token等参数
+  Vue.prototype.$u.http.interceptor.request = (config) => {
+    // config.header.Token = 'xxxxxx';
+    // 方式一,存放在vuex的token,假设使用了uView封装的vuex方式,见:https://uviewui.com/components/globalVariable.html
+    // config.header.token = vm.vuex_token;
+
+    if (vm.vuex_token) {
+      config.header.Authorization = `Bearer ${vm.vuex_token}`;
+    }
+
+    // 方式二,如果没有使用uView封装的vuex方法,那么需要使用$store.state获取
+    // config.header.token = vm.$store.state.token;
+
+    // 方式三,如果token放在了globalData,通过getApp().globalData获取
+    // config.header.token = getApp().globalData.username;
+
+    // 方式四,如果token放在了Storage本地存储中,拦截是每次请求都执行的,所以哪怕您重新登录修改了Storage,下一次的请求将会是最新值
+    // const token = uni.getStorageSync('token');
+    // config.header.token = token;
+    // url加时间戳
+    config.url = config.url + '?t=' + Date.now()
+    // 此url参数为this.$u.get(url)中的url值
+    let noTokenList = ['/wechat/h5/user', '/client/auth/verifyCode'];
+    if (noTokenList.includes(config.url)) config.header.noToken = true;
+    // console.log('noTokenList.includes(config.url)',noTokenList.includes(config.url));
+    // console.log('config.url',config.url);
+    return config;
+  }
+  // 响应拦截,判断状态码是否通过
+  Vue.prototype.$u.http.interceptor.response = (res) => {
+    // 如果把originalData设置为了true,这里得到将会是服务器返回的所有的原始数据
+    // 判断可能变成了res.statueCode,或者res.data.code之类的,请打印查看结果
+    // console.log('interceptor res',res);
+    if (res.code == 200) {
+      // 如果把originalData设置为了true,这里return回什么,this.$u.post的then回调中就会得到什么
+      return res;
+    } else if (res.msg == "令牌不能为空" || res.code == 401) {
+      const backUrl = location.href
+      const loginUrl = 'phoneLogin'
+      if (backUrl.indexOf(loginUrl) > 0) {
+        // localStorage.clear()
+      } else {
+        localStorage.setItem('backUrl', location.href)
+        store.state.vuex_hasLogin = false;
+        alert('还未登录,即将跳转登录');
+        uni.navigateTo({
+          url: "/pages/phoneLogin/phoneLogin"
+        });
+        return;
+      }
+
+    } else return res;
+  }
 }
 
 export default {
-	install
-}
+  install
+}