加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

在Angular2中捕获401异常

发布时间:2020-12-17 07:59:41 所属栏目:安全 来源:网络整理
导读:当我尝试连接到未经授权的网址时,我会进入Chrome: zone.js:1274 POST http://localhost:8080/rest/v1/runs 401 (Unauthorized)core.umd.js:3462 EXCEPTION: Response with status: 401 Unauthorized for URL: http://localhost:8080/rest/v1/runs 我的Home
当我尝试连接到未经授权的网址时,我会进入Chrome:
zone.js:1274 POST http://localhost:8080/rest/v1/runs 401 (Unauthorized)
core.umd.js:3462 EXCEPTION: Response with status: 401 Unauthorized for URL: http://localhost:8080/rest/v1/runs

我的Home Component的代码是:

import {Component,OnInit} from '@angular/core';
import {Run} from "../_models/run";
import {Http,Response} from "@angular/http";
import {RunService} from "../_services/run.service";
import {Observable} from "rxjs";

@Component({
    moduleId: module.id,templateUrl: 'home.component.html'
})

export class HomeComponent implements OnInit{
    url: "http://localhost:8080/rest/v1/runs"
    username: string;
    runs: Run[];

    constructor(private http: Http,private runService: RunService) {

    }

    ngOnInit(): void {
        this.username = JSON.parse(localStorage.getItem("currentUser")).username;
        this.runService.getRuns()
            .subscribe(runs => {
                this.runs = runs;
            });
    }
}

此组件使用此服务:

import { Injectable } from '@angular/core';
import {Http,Headers,Response,RequestOptions,URLSearchParams} from '@angular/http';
import { Observable } from 'rxjs';
import 'rxjs/add/operator/map'
import {AuthenticationService} from "./authentication.service";
import {Run} from "../_models/run";

@Injectable()
export class RunService {
    url = "http://localhost:8080/rest/v1/runs";
    private token: string;

    constructor(private http: Http,private authenticationService: AuthenticationService) {

    }

    getRuns(): Observable<Run[]> {
        return this.http.post(this.url,JSON.stringify({ token: this.authenticationService.token }))
            .map((response: Response) => {
                console.log(response.status);
                if (response.status == 401) {
                    console.log("NOT AUTHORIZED");
                }

                let runs = response.json();
                console.log(runs);
                return runs;
            });
    }
}

捕获401异常的正确方法是什么?我应该在哪里这样做?
在组件或服务中?如果发生任何401响应,最终目标是重定向到“登录”页面.

您很可能希望从您的组件中捕获可以在组件中捕获的错误,该错误可以路由到登录页面.以下代码可以帮助您:

在RunService中:

需要从rxjs导入catch运算符:

import 'rxjs/add/operator/catch';

你的getRuns()函数应该改为

getRuns(): Observable<Run[]> {
    return this.http.post(this.url,JSON.stringify({ token: this.authenticationService.token }))
        .map((response: Response) => {
            let runs = response.json();
            return runs;
        })
        .catch(e => {
            if (e.status === 401) {
                return Observable.throw('Unauthorized');
            }
            // do any other checking for statuses here
        });

然后组件中的ngOnInit将是:

ngOnInit(): void {
    this.username = JSON.parse(localStorage.getItem("currentUser")).username;
    this.runService.getRuns()
        .subscribe(runs => {
            this.runs = runs;
        },(err) => {
            if (err === 'Unauthorized') { this.router.navigateByUrl('/login');
        });
}

显然你会想要根据自己的需要来满足代码并在需要时进行更改但是从Http捕获错误,抛出Observable错误并使用错误回调处理组件中的错误的过程应该可以解决您的问题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读