From 87b5c6927ee0f377d9fc0bcc0f9d1ea6b969ffe6 Mon Sep 17 00:00:00 2001
From: fengxiang <110431245@qq.com>
Date: Wed, 06 Jun 2018 15:12:59 +0800
Subject: [PATCH] 解决超时弹窗反复弹出

---
 src/app/core/net/default.interceptor.ts |   93 ++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 76 insertions(+), 17 deletions(-)

diff --git a/src/app/core/net/default.interceptor.ts b/src/app/core/net/default.interceptor.ts
index 5d7b2e0..6f77ed7 100644
--- a/src/app/core/net/default.interceptor.ts
+++ b/src/app/core/net/default.interceptor.ts
@@ -7,30 +7,69 @@
 import { of } from 'rxjs/observable/of';
 import { ErrorObservable } from 'rxjs/observable/ErrorObservable';
 import { mergeMap, catchError } from 'rxjs/operators';
-import { NzMessageService } from 'ng-zorro-antd';
+import { NzMessageService, NzModalService } from 'ng-zorro-antd';
 import { _HttpClient } from '@delon/theme';
 import { environment } from '@env/environment';
+import { LoginService } from '@business/services/http/login.service';
+import { Subject } from 'rxjs/Subject';
+import { error } from 'protractor';
+import { debug } from 'util';
+import {Location} from '@angular/common';
 
 /**
  * ������HTTP������������������������������ `app.module.ts`
  */
 @Injectable()
 export class DefaultInterceptor implements HttpInterceptor {
-    constructor(private injector: Injector) {}
-
+    private unLoginHandle: Subject<HttpErrorResponse> = new Subject<HttpErrorResponse>();
+    
+    constructor(private injector: Injector) {
+         this.unLoginHandle.debounceTime(1000).subscribe( (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');
+                        }
+                        });
+                    }
+            }
+         });
+    }
+    private isExpireModelShow = false;
+    get loginService(): LoginService {
+        return this.injector.get<LoginService>(LoginService);
+    }
     get msg(): NzMessageService {
         return this.injector.get(NzMessageService);
     }
-
+    get model(): NzModalService {
+        return this.injector.get(NzModalService);
+    }
     private goTo(url: string) {
         setTimeout(() => this.injector.get(Router).navigateByUrl(url));
     }
 
     private handleData(event: HttpResponse<any> | HttpErrorResponse): Observable<any> {
         // ��������������� `throw` ������������������ `_HttpClient` ��� `end()` ������
-        this.injector.get(_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` ������
@@ -44,7 +83,10 @@
                 // }
                 break;
             case 401: // ������������������
-                this.goTo('/passport/login');
+            // this.goTo('/passport/login');
+                if (!this.isLoginPage) {
+                    this.unLoginHandle.next(<HttpErrorResponse>event);
+                }
                 break;
             case 403:
             case 404:
@@ -52,30 +94,47 @@
                 this.goTo(`/${event.status}`);
                 break;
         }
-        return of(event);
+        // ��������������������� httpclient ������������
+        if (event instanceof HttpErrorResponse) {
+            return ErrorObservable.create(event);
+        } else {
+            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>> {
-
+        Observable<HttpSentEvent | HttpHeaderResponse | HttpProgressEvent | HttpResponse<any> | HttpUserEvent<any>> {       
         // ���������������������������
         let url = req.url;
-        if (!url.startsWith('https://') && !url.startsWith('http://')) {
-            url = environment.SERVER_URL + url;
+        if (!url.startsWith('https://') && !url.startsWith('http://') && !url.startsWith('assets')) {
+            // url = environment.SERVER_URL + url;
+            url = environment.SERVER_BASH_URL + url;
         }
 
         const newReq = req.clone({
             url: url
         });
         return next.handle(newReq).pipe(
-                    mergeMap((event: any) => {
+                    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