易用性方面的一点优化 (#673)

* 增加用户token有效时长配置

* 修复登录根路径时不校验登录态问题

* 优化登录后及登录态失效后的页面跳转

* Update UserController.java

* Update AuthInterceptor.java

* Update application.properties

* Update http-common.js

* Update http-common.js

* Update Login.vue

* Update http-common.js

Co-authored-by: chaihaipeng <chaihaipeng@sogou-inc.com>
diff --git a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/controller/UserController.java b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/controller/UserController.java
index 4cfb3f1..84a7940 100644
--- a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/controller/UserController.java
+++ b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/controller/UserController.java
@@ -43,6 +43,10 @@
     private String rootUserName;
     @Value("${admin.root.user.password:}")
     private String rootUserPassword;
+    //make session timeout configurable
+    //default to be an hour:1000 * 60 * 60
+    @Value("${admin.check.sessionTimeoutMilli:3600000}")
+    private long sessionTimeoutMilli;
 
     @RequestMapping(value = "/login", method = RequestMethod.GET)
     public String login(@RequestParam String userName, @RequestParam String password) {
@@ -69,7 +73,7 @@
 
     @Scheduled(cron= "0 5 * * * ?")
     public void clearExpiredToken() {
-        tokenMap.entrySet().removeIf(entry -> entry.getValue() == null || System.currentTimeMillis() - entry.getValue().getLastUpdateTime() > 1000 * 60 * 15);
+        tokenMap.entrySet().removeIf(entry -> entry.getValue() == null || System.currentTimeMillis() - entry.getValue().getLastUpdateTime() > sessionTimeoutMilli);
     }
 
     public static class User {
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 a9cf6cc..ecc6e57 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
@@ -35,12 +35,11 @@
 public class AuthInterceptor extends HandlerInterceptorAdapter {
     @Value("${admin.check.authority:true}")
     private boolean checkAuthority;
-
+    
     //make session timeout configurable
     //default to be an hour:1000 * 60 * 60
     @Value("${admin.check.sessionTimeoutMilli:3600000}")
     private long sessionTimeoutMilli;
-
     @Override
     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
         if (!(handler instanceof HandlerMethod) || !checkAuthority) {
diff --git a/dubbo-admin-server/src/main/resources/application.properties b/dubbo-admin-server/src/main/resources/application.properties
index a34f434..01e2943 100644
--- a/dubbo-admin-server/src/main/resources/application.properties
+++ b/dubbo-admin-server/src/main/resources/application.properties
@@ -31,6 +31,9 @@
 admin.config-center.group=dubbo
 admin.metadata-report.group=dubbo
 
+#session timeout, default is one hour
+admin.check.sessionTimeoutMilli=3600000
+
 #namespace used by nacos
 admin.registry.namespace=public
 admin.config-center.namespace=public
diff --git a/dubbo-admin-ui/src/Login.vue b/dubbo-admin-ui/src/Login.vue
index e462bf1..c9e18f0 100644
--- a/dubbo-admin-ui/src/Login.vue
+++ b/dubbo-admin-ui/src/Login.vue
@@ -85,7 +85,13 @@
           if (response.status === 200 && response.data) {
             localStorage.setItem('token', response.data)
             localStorage.setItem('username', userName)
-            this.$router.replace('/')
+            //login and redirect
+            let redirect = this.$route.query.redirect
+            if(redirect) {
+                this.$router.replace(redirect)
+            } else {
+                this.$router.replace('/')
+            }
           } else {
             vm.$notify('Username or password error,please try again')
           }
diff --git a/dubbo-admin-ui/src/components/http-common.js b/dubbo-admin-ui/src/components/http-common.js
index 00a3967..30946a8 100644
--- a/dubbo-admin-ui/src/components/http-common.js
+++ b/dubbo-admin-ui/src/components/http-common.js
@@ -41,7 +41,12 @@
     localStorage.removeItem('token')
     localStorage.removeItem('username')
     Vue.prototype.$notify.error(i18n.t('authFailed'))
-    router.push({ path: 'login' })
+    let paths = location.href.split('#')
+    if (paths.length > 1 && paths[1].startsWith('/login')) {
+      // avoid splicing multiple redirects
+      return
+    }
+    router.push({path: 'login', query: {redirect: paths.length === 1 ? '/' : paths[1]}})
   } else if (error.response.status >= HttpStatus.BAD_REQUEST) {
     Vue.prototype.$notify.error(error.response.data.message)
   }