Navigate to login page When auth token failed (#683)

fix #682
diff --git a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/interceptor/AuthInterceptor.java b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/interceptor/AuthInterceptor.java
index ac18432..98ddb47 100644
--- a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/interceptor/AuthInterceptor.java
+++ b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/interceptor/AuthInterceptor.java
@@ -47,7 +47,7 @@
         if (null != authority && authority.needLogin()) {
             String authorization = request.getHeader("Authorization");
             UserController.User user = UserController.tokenMap.get(authorization);
-            if (null != user && System.currentTimeMillis() - user.getLastUpdateTime() <= 1000 * 60 * 15) {
+            if (null != user && System.currentTimeMillis() - user.getLastUpdateTime() <= 1000 * 60 * 60) {
                 user.setLastUpdateTime(System.currentTimeMillis());
                 return true;
             }
diff --git a/dubbo-admin-ui/src/components/http-common.js b/dubbo-admin-ui/src/components/http-common.js
index 96890bf..00a3967 100644
--- a/dubbo-admin-ui/src/components/http-common.js
+++ b/dubbo-admin-ui/src/components/http-common.js
@@ -17,6 +17,8 @@
 import axios from 'axios'
 import Vue from 'vue'
 import HttpStatus from 'http-status'
+import router from '@/router'
+import i18n from '@/lang'
 
 let instance = axios.create({
   baseURL: '/api/dev'
@@ -38,7 +40,8 @@
   } else if (error.response.status === HttpStatus.UNAUTHORIZED) {
     localStorage.removeItem('token')
     localStorage.removeItem('username')
-    Vue.prototype.$notify.error('Authorized failed,please login.')
+    Vue.prototype.$notify.error(i18n.t('authFailed'))
+    router.push({ path: 'login' })
   } else if (error.response.status >= HttpStatus.BAD_REQUEST) {
     Vue.prototype.$notify.error(error.response.data.message)
   }
diff --git a/dubbo-admin-ui/src/lang/en.js b/dubbo-admin-ui/src/lang/en.js
index 9fecb4e..1e84461 100644
--- a/dubbo-admin-ui/src/lang/en.js
+++ b/dubbo-admin-ui/src/lang/en.js
@@ -195,5 +195,6 @@
       unsupportedHtmlTypeTip: 'Temporarily unsupported form type',
       none: 'none'
     }
-  }
+  },
+  authFailed:'Authorized failed,please login.'
 }
diff --git a/dubbo-admin-ui/src/lang/zh.js b/dubbo-admin-ui/src/lang/zh.js
index 36c72e6..0b4407a 100644
--- a/dubbo-admin-ui/src/lang/zh.js
+++ b/dubbo-admin-ui/src/lang/zh.js
@@ -195,5 +195,6 @@
       unsupportedHtmlTypeTip: '暂不支持的表单类型',
       none: '无'
     }
-  }
+  },
+  authFailed:'权限验证失败'
 }
diff --git a/dubbo-admin-ui/src/main.js b/dubbo-admin-ui/src/main.js
index 820ed0f..1ff8077 100644
--- a/dubbo-admin-ui/src/main.js
+++ b/dubbo-admin-ui/src/main.js
@@ -47,14 +47,6 @@
 Vue.use(VueClipboard)
 Vue.component('chart', ECharts)
 
-/* eslint-disable no-new */
-new Vue({
-  router,
-  store,
-  i18n,
-  render: h => h(App)
-}).$mount('#app')
-
 router.beforeEach((to, from, next) => {
   if (to.matched.some(record => record.meta.requireLogin)) {
     if (localStorage.getItem('token')) {
@@ -69,3 +61,11 @@
     next()
   }
 })
+
+/* eslint-disable no-new */
+new Vue({
+  router,
+  store,
+  i18n,
+  render: h => h(App)
+}).$mount('#app')
diff --git a/dubbo-admin-ui/vue.config.js b/dubbo-admin-ui/vue.config.js
index d61c31c..b4b6fa2 100644
--- a/dubbo-admin-ui/vue.config.js
+++ b/dubbo-admin-ui/vue.config.js
@@ -39,6 +39,7 @@
     }
   },
   configureWebpack: {
+    devtool: process.env.NODE_ENV === 'dev' ? 'source-map' : undefined,
     performance: {
       hints: false
     },