在Angular 2中处理过期的cookie

时间:2016-08-17 07:22:57

标签: javascript cookies angular observable

我正在尝试使用Angular 2并尝试使用document.cookie作为我的访问令牌存储。

我所做的是设置一个带有accessstoken& amp;到期30分钟。现在应用程序将加载cookie,以便随后的api进程处理得非常好,直到30分钟。我的问题是我想检查cookie是否过期,然后获取新的accessstoken将其设置为cookie并调用相应的方法。

这是我的代码

import { Injectable } from '@angular/core';
import { Http, Response, Headers } from '@angular/http';
import { Observable, Operator} from 'rxjs/Rx';

import { AccessToken } from './access-token.service';


@Injectable()
export class DataService {  

  constructor(
      private _accessToken : AccessToken,
      private _http: Http
  ) {}

  request(url:string){
      var token = this._accessToken.readCookie();
      return this._http.get(url,{
          headers : new Headers({
              "Authorization" : "Bearer " + token
          })
      })
          .map(data => data.json().result)
          .catch(this._handleError)

  }

  fetchData(dataurl:string){
     var token = this._accessToken.readCookie();

     if(!token){        
        this._accessToken.getToken()
            .subscribe(
                response => {
                    this._accessToken.setCookie(response);                  
                }
            )
            // I want to call this.request() after the accesstoken has been set to the document.cookie

      } else {
            return this.request(dataurl)
      }
  }

  getAllProducts(){
      return this.fetchData('https://localhost/api/products');
  }


  private _handleError (error: Response) {
      console.error(error);
      return Observable.throw(error.json().error || 'Server error');
  }
}

this._accessToken.getToken()方法向端点发出http.post请求并获取accessstoken。 this._accessToken.setCookie()方法然后设置document.cookie,其accessestoken和到期时间为30分钟。

我不确定如何对fetchData()方法的cookie过期进行排序,以便它首先获得accessstoken将其设置为cookie然后只调用request方法。

由于

1 个答案:

答案 0 :(得分:1)

只需在subscribe(...)回调

中移动来电即可
if(!token){        
    this._accessToken.getToken()
        .subscribe(
            response => {
                this._accessToken.setCookie(response);                  
                // I want to call this.request() after the accesstoken has been set to the document.cookie
            }
        )

  } else {