【问题标题】:How do I check if webpage return 401?如何检查网页是否返回 401?
【发布时间】:2018-11-20 23:00:36
【问题描述】:

我正在实施一项服务,该服务需要 JWT 令牌才能访问。

当 JWT 令牌过期时,下面会显示在页面本身上。

<oauth>
<error_description>
Access token expired: <token_value>
</error_description>
<error>invalid_token</error>
</oauth> 

在角度上,我正在路由的是

{ path: '', component: HomeComponent }

例子:

当我启动页面时(本地 - https://localhost:8080/) 我会收到令牌过期错误。我想将 401 捕获为页面加载。

那么如何检查当前页面是否返回 401?例如,假设如果用户刷新页面,我如何获得 401 响应而不是在网页本身中显示它。

【问题讨论】:

  • 路由不返回 401,因为它是客户端。 401 是“未经授权的请求”的服务器端响应。因此,您的代码中的某些内容很可能会进入服务器并且无法访问资源。如果你想全局捕获 http 请求并在一个地方处理它们,你可以使用拦截器。阅读文档。
  • 4XX 代码通常是客户端 ding 一些服务器不期望的东西。如果您能够验证页面是否确实返回了 401,则可以使用拦截器来检查状态。请参阅以下内容以供参考:stackoverflow.com/questions/47842939/…
  • 现在的问题是我不知道上面的请求是在哪里提出的。我路由到该页面,并且令牌附加在 cookie 中。我没有明确获取令牌,并且当令牌过期时页面加载时显示上述错误。

标签: angular jwt


【解决方案1】:

我不确定我是否理解所有上下文,也不清楚您是否可以从 cookie 中读取,如果您可以读取 cookie,在 HomeComponent 中您可能有一种方法来检查 cookie 中的令牌是否在您调用需要令牌的服务之前已过期(因此您不会获得 401 )

 import { CookieService } from 'ngx-cookie';
 @Component({
    selector: 'home-component',
    templateUrl: './app.component.html',
    styleUrls: ['./app.component.scss']
 })
 export class HomeComponent {
  tokenValid = true;
  constructor(public cookie: CookieService) {}

  ngOnInit(){
   this.tokenValid = this.isAccessTokenValid();
   if(this.tokenValid) {
     //call a service that uses the token
   }else {
     //do whatever
   }

  }

  isAccessTokenValid(): boolean {
   const acc_token = this.cookieService.get('token_in_cookie'); // use your key
   if (!!acc_token) {
     if (jwtService.isTokenExpired(acc_token)) {
       return false;
     }
     return true;
   } else {
   return false;
  }
 }

}

如果您需要的只是处理来自服务器的 401,那么您可能需要按照上述 cmets 中的建议实施和拦截器,例如 ...

@Injectable({
  providedIn: 'root'
})
export class HttpRequestInteceptorError implements HttpInterceptor {

 constructor() { }

 intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

   return next.handle(req).pipe(catchError(err => {
     if (err instanceof HttpErrorResponse) {

      // Token expired
      if (err.status === 401) {
        // refresh access_token or whatever
      }
    }
    return throwError(err);
  }));
 }
}

希望这会有所帮助!

【讨论】:

  • 谢谢,但拦截实际上只在请求是在起始页面之后进行时才拦截。我的问题是在起始页面上遇到了这个 401 错误。
猜你喜欢
  • 2015-03-05
  • 2017-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-27
  • 2010-12-14
相关资源
最近更新 更多