From 50223d066f7bb4446e47467463783b7f0170f889 Mon Sep 17 00:00:00 2001
From: fengxiang <110431245@qq.com>
Date: Wed, 06 Jun 2018 13:59:30 +0800
Subject: [PATCH] 登录失效拦截完善

---
 src/app/core/net/default.interceptor.ts |   82 ++++++++++++++++++++++++++---------------
 1 files changed, 52 insertions(+), 30 deletions(-)

diff --git a/src/app/core/net/default.interceptor.ts b/src/app/core/net/default.interceptor.ts
index d7280ea..e1b947f 100644
--- a/src/app/core/net/default.interceptor.ts
+++ b/src/app/core/net/default.interceptor.ts
@@ -21,26 +21,39 @@
  */
 @Injectable()
 export class DefaultInterceptor implements HttpInterceptor {
-    private unLoginHandle: Subject<HttpErrorResponse> = new Subject<HttpErrorResponse>();
+    // private unLoginHandle: Subject<HttpErrorResponse> = new Subject<HttpErrorResponse>();
+    
     constructor(private injector: Injector) {
-         this.unLoginHandle.debounceTime(800).subscribe(event => {
-             if (!!event.error) {
-                  let errorMsg = '';
-                  const erroCode = Number.parseInt(event.error['errorCode']);
-                  switch (erroCode) {
-                     case 10: errorMsg = '���������,���������'; break;
-                     case 11: errorMsg = '������������,���������������'; break;
-                     case 12: errorMsg = '������������,������������������'; break;
-                     default: errorMsg = '������������,���������������'; break;
-                  }
-                  this.model.info({
-                    title: errorMsg,
-                    onOk: () => this.goTo('/passport/login')
-                  });
-             }
-         });
     }
-
+    private isExpireModelShow = false;
+    private unLoginHandle(event: HttpErrorResponse) {
+        if (!!event.error) {
+            let errorMsg = '';
+            const erroCode =  !!event.error['errorCode'] ? Number.parseInt(event.error['errorCode']) : 0;
+            switch (erroCode) {
+               case 10: errorMsg = '���������,���������'; break;
+               case 11: errorMsg = '������������,���������������'; break;
+               case 12: errorMsg = '������������,������������������'; break;
+               case 0: errorMsg = '���������������������������'; break;
+               default: errorMsg = '������������,���������������'; break;
+            }
+            if (!this.isExpireModelShow) {
+                this.isExpireModelShow = true;
+                // ������refresh���������������������
+                this.loginService.clearRefreshToken();
+                this.model.info({
+                  title: errorMsg,
+                  onOk: () => {
+                      this.isExpireModelShow = false;
+                      this.goTo('/passport/login');
+                  }
+                });
+            }
+       }
+    }
+    get loginService(): LoginService {
+        return this.injector.get<LoginService>(LoginService);
+    }
     get msg(): NzMessageService {
         return this.injector.get(NzMessageService);
     }
@@ -55,7 +68,8 @@
         // ��������������� `throw` ������������������ `_HttpClient` ��� `end()` ������
         // this.injector.get(_HttpClient).end();
         // ���������������������������������
-        switch (event.status) {
+        const status = !!event.status ? event.status : 401;
+        switch (status) {
             case 200:
                 // ��������������������������������������������������� `status` ��������� `0` ���������������������
                 // ��������� `error_message` ������
@@ -70,8 +84,8 @@
                 break;
             case 401: // ������������������
             // this.goTo('/passport/login');
-                if (location.hash && !location.hash.endsWith('login')) {
-                    this.unLoginHandle.next(<HttpErrorResponse>event);
+                if (!this.isLoginPage) {
+                    this.unLoginHandle(<HttpErrorResponse>event);
                 }
                 break;
             case 403:
@@ -87,13 +101,11 @@
             return of(event);
         }       
     }
-
+    private get isLoginPage(): boolean {
+        return !!location && !!location.hash && location.hash.endsWith('login');
+    }
     intercept(req: HttpRequest<any>, next: HttpHandler):
-        Observable<HttpSentEvent | HttpHeaderResponse | HttpProgressEvent | HttpResponse<any> | HttpUserEvent<any>> {
-        if (!req.headers.get('X-Refrsh-Token')) {
-            const loginService = <LoginService>this.injector.get(LoginService);
-            loginService.refreshToken();
-        }        
+        Observable<HttpSentEvent | HttpHeaderResponse | HttpProgressEvent | HttpResponse<any> | HttpUserEvent<any>> {       
         // ���������������������������
         let url = req.url;
         if (!url.startsWith('https://') && !url.startsWith('http://') && !url.startsWith('assets')) {
@@ -107,12 +119,22 @@
         return next.handle(newReq).pipe(
                     mergeMap((event: any) => {                        
                         // ������������������������������������������������������������������������������������������������HTTP������������������200������������������
-                        if (event instanceof HttpResponse && event.status === 200)
-                            return this.handleData(event);
+                        if (event instanceof HttpResponse && event.status === 200) {
+                                // ������token���������������������������
+                                if (!this.isLoginPage 
+                                    && !!newReq.headers 
+                                    && !newReq.headers.get('X-Refrsh-Token')
+                                    && !url.startsWith('assets')) {                                    
+                                    this.loginService.refreshToken();
+                                } 
+                                return this.handleData(event);
+                            }
                         // ������������������������������������
                         return of(event);
                     }),
-                    catchError((err: HttpErrorResponse) => this.handleData(err))
+                    catchError((err: HttpErrorResponse) => {
+                        return this.handleData(err);
+                    })
                 );
     }
 }

--
Gitblit v1.8.0