You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
121 lines
3.7 KiB
121 lines
3.7 KiB
import { Injectable } from "@angular/core"; |
|
import { |
|
HttpClient, |
|
HttpInterceptor, |
|
HttpHandler, |
|
HttpRequest, |
|
HttpErrorResponse, |
|
HttpResponse, |
|
} from "@angular/common/http"; |
|
|
|
import { throwError } from "rxjs"; |
|
import { catchError, tap, finalize } from "rxjs/operators"; |
|
import { Router } from "@angular/router"; |
|
import { NzMessageService } from "ng-zorro-antd/message"; |
|
//baseurl |
|
// const baseurl = 'http://39.106.78.171:8008'; |
|
|
|
@Injectable() |
|
export class BaseInterceptor implements HttpInterceptor { |
|
constructor(private router: Router, private message: NzMessageService) {} |
|
|
|
intercept(req, next: HttpHandler) { |
|
// req.url = "/youzhan" + req.url; |
|
// req.urlWithParams = "/youzhan" + req.urlWithParams; |
|
let params = req.params; |
|
for (const key of req.params.keys()) { |
|
if (params.get(key) === undefined || params.get(key) === null) { |
|
params = params.delete(key, undefined); |
|
} |
|
} |
|
req = req.clone({ params }); |
|
// debugger |
|
// console.log('xxxxxx',req) |
|
let newReq = req.clone({ |
|
url: req.hadBaseurl ? `${req.url}` : `${req.url}`, |
|
}); |
|
if (!req.cancelToken) { |
|
/*获取token*/ |
|
let token = sessionStorage.getItem("token"); |
|
/*此处设置额外请求头,token令牌*/ |
|
if (!!token) { |
|
newReq.headers = newReq.headers.set("Authorization", `Bearer ${token}`); |
|
} |
|
} |
|
|
|
// 携带请求头发送下一次请求 |
|
return next.handle(newReq).pipe( |
|
tap( |
|
(event) => { |
|
if (event instanceof HttpResponse) { |
|
// 成功 |
|
// console.log('成功', event.headers.get('x-refresh-encryptedtoken')) |
|
if (!!event.headers.get("x-refresh-token")) { |
|
sessionStorage.setItem( |
|
"token", |
|
event.headers.get("x-refresh-token") |
|
); |
|
sessionStorage.setItem( |
|
"encryptedAccessToken", |
|
event.headers.get("x-refresh-encryptedtoken") |
|
); |
|
} |
|
} |
|
}, |
|
(error) => { |
|
// 失败 |
|
console.log("请求http失败", error); |
|
this.handleError(error); |
|
} |
|
), |
|
finalize(() => { |
|
// 请求完成 |
|
// console.log('complete') |
|
}) |
|
); |
|
} |
|
|
|
// 捕获错误 |
|
//401 token过期 403没权限!!! 400参数错误 404未找到 614刷新令牌过期!!! |
|
|
|
private handleError(error: HttpErrorResponse) { |
|
// 用户认证失败返回登录页 |
|
if (error.status === 401 || error.status === 614) { |
|
sessionStorage.clear(); |
|
localStorage.removeItem("isautologin"); |
|
this.message.create("error", `用户认证信息过期,请重新登录!`); |
|
this.router.navigate(["/singlelogin"]); |
|
} |
|
if (error.status === 403) { |
|
this.message.create("error", `对不起,您无此权限!`); |
|
} |
|
if (error.status === 400) { |
|
this.message.create("error", `请核对您的输入信息或格式是否正确!`); |
|
} |
|
if (error.status === 500) { |
|
if (error.error.error.message) { |
|
this.message.create( |
|
"error", |
|
`${error.error.error.details || error.error.error.message}` |
|
); |
|
} else { |
|
this.message.create("error", `状态500`); |
|
} |
|
} |
|
if (error.status === 404) { |
|
this.message.create("error", `${error.error.error.message}`); |
|
} |
|
if (error.error instanceof ErrorEvent) { |
|
// 发生客户端或网络错误。相应处理。 |
|
console.error("An error occurred:", error.error.error.message); |
|
} else { |
|
// 服务端返回http状态码 |
|
// 服务端返回错误信息 |
|
console.error( |
|
`Backend returned code ${error.status}, ` + `body was: ${error.error}` |
|
); |
|
} |
|
// 返回带有面向用户的错误信息 |
|
return throwError(error); |
|
} |
|
}
|
|
|