【问题标题】:HttpClient token refreshHttpClient 令牌刷新
【发布时间】:2017-10-24 06:42:23
【问题描述】:

我有这个拦截器:

import {Observable} from 'rxjs/Observable';
import {Injectable} from '@angular/core';
import {HttpEvent, HttpInterceptor, HttpHandler, HttpRequest, HttpErrorResponse, HttpParams} from '@angular/common/http';

import {SessionStorageService} from 'ng2-webstorage';

@Injectable()
export class HttpInterceptorService implements HttpInterceptor {
    constructor(private sessionStorage: SessionStorageService) {
    }
    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        const url = '/';
        req = req.clone({
            url: url + req.url,
            headers: req.headers.set('Authorization', this.sessionStorage.retrieve('access_token'))
        });
        return next.handle(req).catch(err => {
            if (err instanceof HttpErrorResponse) {
                console.log('interceptor error');
                console.log(err);
                if (err.status === 401) {

                    return Observable.throw(err);
                }


            }
        });

    }
}

我需要的是在当前过期时获取一个新令牌(结束对某个带有参数的“url”的请求),如果我在任何请求上得到响应 401,然后保持请求(和所有其他请求)直到我得到一个新的令牌。如果 refresh_token 也过期了(也得到了 401),那就做点别的吧。

params: new HttpParams().set('Token',  this.sessionStorage.retrieve('refresh_token'))

我不明白如何请求新令牌。

接下来我做了什么

if (err.status === 401) {
                    const params = new HttpParams().set('token', this.sessionStorage.retrieve('refresh_token'));
                    req = req.clone({
                        method:'post',
                        url: url + '/auth/refresh',
                        params: params,
                        headers: req.headers.set('Authorization', this.sessionStorage.retrieve('refresh_token'))
                    });
                     next.handle(req).subscribe(res => {

                        console.log('res',res);
                    });
                    return Observable.throw(err);
                }

但是我得到了resbody 以及其他对我的数据来说不必要的东西。我怎样才能从body 只得到data

当我尝试执行 res.bodyres._bodyres.text() 之类的操作时,出现如下错误:

Property '_body' does not exist on type 'HttpEvent<any>'.
Property '_body' does not exist on type 'HttpSentEvent'.

res['body'] 帮助我。但我得到一个字符串数据。当我尝试做JSON.parse(res['body']); 时,我的请求状态是转到cancel。而且我不能做这个请求。

【问题讨论】:

  • 你可以试试:res.json()
  • 如果你得到401,这意味着你必须处理HttpErrorResponse类型。那个有属性error˙这是你需要的:它将包含错误响应正文中返回的任何服务器。参考:angular.io/api/common/http/HttpErrorResponse(查看描述部分)

标签: angular typescript httpclient access-token angular2-services


【解决方案1】:

来自next.handle(req) 的响应类型为HttpEvent,如果您对必须执行的实际响应事件感兴趣:

if (res instanceof HttpResponse) {
  const body = res.body;
  // to something with the response body
}

更多信息请访问docs

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-20
    • 2022-10-31
    • 2016-01-05
    • 2019-06-29
    • 1970-01-01
    • 2020-07-12
    • 1970-01-01
    相关资源
    最近更新 更多