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