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