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 +++++++++++++++++----------
 src/app/routes/passport/login/login.component.ts   |   11 +++
 src/app/routes/passport/login/login.component.html |    1 
 src/app/business/services/http/login.service.ts    |   32 ++++++++--
 4 files changed, 87 insertions(+), 39 deletions(-)

diff --git a/src/app/business/services/http/login.service.ts b/src/app/business/services/http/login.service.ts
index b5c1b6f..989d7d7 100644
--- a/src/app/business/services/http/login.service.ts
+++ b/src/app/business/services/http/login.service.ts
@@ -23,12 +23,14 @@
           // ���2���������������������token������������
           setInterval(
              () => {
-                 if (this.needFreshFromLocal && this.isReachRefreshTime()) {
+                 if (this.canRefreshToken()
+                     && this.needFreshFromLocal 
+                     && this.isReachRefreshTime()) {
+                        const _refreshToken =  this._refreshToken;    
                         // ������������������
                         this.setRefreshTime();
                         // ������needfreshtoken
-                        localStorage.setItem('needRefreshToken', 'false');
-                        const _refreshToken =  this._refreshToken;                        
+                        localStorage.setItem('needRefreshToken', 'false');                                            
                         if (!!_refreshToken) {
                             this.http.get(this.urls.refreshToken, {headers: {'X-Refrsh-Token': 'Bearer ' + _refreshToken}} )
                             .subscribe(
@@ -75,7 +77,7 @@
      return localStorage.needRefreshToken === 'true';
   }
   private setRefreshTime() {
-          localStorage.setItem('refreshTime', new Date().getTime().toString());
+    localStorage.setItem('refreshTime', new Date().getTime().toString());
   }
   private setNeedRefreshToken() {
     localStorage.setItem('needRefreshToken', 'true');
@@ -84,11 +86,27 @@
         const expiredTime = Number(localStorage.expiredTime);
         return !!this.refreshTime && !!expiredTime && this.refreshTime + (expiredTime / 2) * 60000 < new Date().getTime();
   }
-  get refreshTime(): number  {
+  private get refreshTime(): number  {
     return  Number(localStorage.refreshTime);
   }
+  public clearRefreshToken() {
+    localStorage.expiredTime = null;
+    localStorage.refreshTime = null;
+    localStorage.refreshToken = null;
+    this.authorization = null;
+    localStorage.removeItem('expiredTime');
+    localStorage.removeItem('refreshTime');
+    localStorage.removeItem('refreshToken');
+  }
+  private canRefreshToken() {
+     return !!localStorage.getItem('expiredTime') 
+            && !!localStorage.getItem('refreshTime') 
+            && !!localStorage.getItem('refreshToken');
+  }
   public refreshToken () {
-           // ������������������token
-           this.setNeedRefreshToken();
+    if (this.canRefreshToken()) {
+      // ������������������token
+      this.setNeedRefreshToken();
+    }
   }
 }
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);
+                    })
                 );
     }
 }
diff --git a/src/app/routes/passport/login/login.component.html b/src/app/routes/passport/login/login.component.html
index 5abc040..5e7e684 100644
--- a/src/app/routes/passport/login/login.component.html
+++ b/src/app/routes/passport/login/login.component.html
@@ -23,6 +23,7 @@
             <div nz-form-explain *ngIf="(password.dirty || password.touched) && password.errors?.required">������������������</div>
             <p nz-form-explain [ngStyle]="{'color': 'red'}" *ngIf="validateError.password_incorrect">������������������������������������</p>
             <p nz-form-explain [ngStyle]="{'color': 'red'}" *ngIf="validateError.account_expired">������������������������������������������</p>
+            <p nz-form-explain [ngStyle]="{'color': 'red'}" *ngIf="validateError.server_offline">������������������������������</p>
         </div>
     </div>
     <div nz-form-item nz-row>
diff --git a/src/app/routes/passport/login/login.component.ts b/src/app/routes/passport/login/login.component.ts
index 70a508e..f0ee060 100644
--- a/src/app/routes/passport/login/login.component.ts
+++ b/src/app/routes/passport/login/login.component.ts
@@ -11,6 +11,7 @@
 import { ReuseTabService } from '@delon/abc';
 import { environment } from '@env/environment';
 import { CookieService } from 'angular2-cookie/services/cookies.service';
+import { debounce } from 'rxjs/operators';
 @Component({
     selector: 'passport-login',
     templateUrl: './login.component.html',
@@ -85,8 +86,11 @@
             if (this.mobile.invalid || this.captcha.invalid) return;
         }
         this.loading = true;
-            this.loginService.validate(this.userName.value, this.password.value).subscribe(
+        this.loginService.validate(this.userName.value, this.password.value).subscribe(
                 (res: Authorization) => {
+                    this.validateError['password_incorrect'] = false;
+                    this.validateError['account_expired'] = false;
+                    this.validateError['server_offline'] = false;
                    if (res.token != null) {
                         // ������������������������
                        this.reuseTabService.clear();
@@ -99,7 +103,7 @@
                        this.router.navigate(['/']);
                    }
                 },
-                (err: HttpErrorResponse) => {  
+                (err: HttpErrorResponse) => {
                     if (!!err) {
                         const errMsg = err.error;
                         console.log(errMsg);
@@ -109,6 +113,9 @@
                        } else if (errMsg.status === 401 && errMsg.errorCode === 12) {
                            this.validateError['account_expired'] = true;
                            this.loading = false;
+                       } else if (!errMsg.status  && !errMsg.errorCode) {
+                           this.validateError['server_offline'] = true;
+                           this.loading = false;
                        }
                     }                  
                 }

--
Gitblit v1.8.0