angular统一拦截器的书写

统一拦截器,顾名思义就是统一拦截所有的请求,然后根据请求书写自己的业务逻辑,比如请求结果session过期处理,在header头部加上验证参数token等等,这个时候就需要用到拦截器。
首先我们创建一个类,名为AuthHttpInterceptor的拦截器并且继承了HttpInterceptor拦截器:


image.png

拦截器的具体实现部分:


image.png

业务处理:一些通用操作,根据服务器返回来的状态处理不同的业务,请求的参数不对,token过期没有通过验证,这个时候需要我们做统一处理


image.png

最后我们要在app.module.ts中添加我们的拦截器


image.png

已经写了好几年现在需要用到,重新整理了一下,记得点赞哦

代码如下:
import { Injectable } from "@angular/core";
import {
HttpErrorResponse,
HttpEvent,
HttpHandler, HttpHeaderResponse, HttpInterceptor, HttpRequest, HttpResponse,
} from "@angular/common/http";
import { Observable, of } from "rxjs/index";
import { catchError, mergeMap } from "rxjs/internal/operators";
import { StorageService } from '../servers/storage.service';
/**

  • 统一拦截器
    */
    @Injectable()
    export class AuthHttpInterceptor implements HttpInterceptor {
    headers: any;
    constructor(
    private storageService: StorageService
    ) { }
    intercept(request: HttpRequest, next: HttpHandler): Observable> {
    let req: any;
    if (request.url.endsWith('/login')) {
    let req = request.clone({
    headers: request.headers.set('JSESSIONID', 'JSESSIONID ' + null)
    });//这里可以在请求中加参数
    return this.newMethod(next, req)
    } else {
    let req = request.clone({
    headers: request.headers.set('Content-Type','application/x-www-form-urlencoded')
    });
    return this.newMethod(next, req)
    }
    }
    private newMethod(next: HttpHandler, req: HttpRequest): Observable> {
    return next.handle(req).pipe(mergeMap((event: any) => {
    // 正常返回,处理具体返回参数
    if (event instanceof HttpResponse && event.status === 200) {
    //console.log(event);
    return this.handleData(event); //具体处理请求返回数据
    }
    return of(event);
    }), catchError((err: HttpErrorResponse) => this.handleData(err)));
    }
    private handleData(event: HttpResponse | HttpErrorResponse): Observable {
    // 业务处理:一些通用操作
    switch (event.status) {
    case 200:
    if (event instanceof HttpResponse) {
    //const body: any = event.body;
    return of(event);
    }
    break;
    case 401: // 未登录状态码
    case 404:
    case 500:
    default:
    return of(event);
    }
    }
    //
    private getAccessToken(): string {
    const token = this.storageService.get('AccessToken')
    return token;
    }
    private getSessionId(): string {
    const token = this.storageService.get('jsessionid')
    return token;
    }
    }

你可能感兴趣的:(angular统一拦截器的书写)