角-如何处理重定向

时间:2018-09-12 08:06:04

标签: angular http-status-code-302

我使用Spring Security,它将未经身份验证的用户重定向到登录页面。

因此,当未经身份验证的角度客户端向端点(期望JSON)发送GET请求时,它将接收登录页面的HTML内容,并且JSON解析器失败(Angular2 watch for 302 redirect when fetching resource

get_add_if_missing

如何在Angular中处理重定向?

4 个答案:

答案 0 :(得分:0)

这不是很干净,我建议使用RouterGuards处理路由和状态。但是,如果JSON解析器失败(并且这是未登录的定义,则可以使用错误处理程序在客户端上处理重定向。

const httpObservable = this.http
                                .get(urlThatWillRedirect)
                                .subscribe(
                                  (data) => {//handle data},
                                  (error) => {// redirect to login page}          
                                ); 

答案 1 :(得分:0)

正确的解决方案是将服务器端代码更改为不返回302状态代码,因为浏览器会在Angular(或任何相关的SPA)对它执行任何操作之前启动重定向。通常,您要为此目的返回401/403。

如果这是不可能的,唯一的选择是实施一个拙劣的解决方案,以某种方式认识到响应确实是重定向,并使用HttpInterceptors对其进行适当处理。这是AngularJS中的等效示例。

在Angular 2+中,you could probably follow something like this检查响应是否为重定向页面:

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    return next.handle(req)
      .do(event => {
        if (event instanceof HttpResponseBase) {
          const response = event as HttpResponseBase;
          if (response && response.ok && response.url && response.url.toLowerCase().indexOf(this.logoPartialUrl) >= 0) {
            // Modify this portion appropriately to match your redirect page
            const queryStringIndex = response.url.indexOf('?');
            const loginUrl = queryStringIndex && queryStringIndex > 0 ? response.url.substring(0, queryStringIndex) : response.url;
            console.log('User logout detected, redirecting to login page: %s', loginUrl);
            window.location.href = loginUrl;
          }
        }
      });

答案 2 :(得分:0)

error代码异常的情况下,将页面重定向到service response。您可以通过在service类中添加一个方法并将其添加到响应的catch的{​​{1}}中来解决此问题。正如 @ I46kok 所说的那样,我们也可能会处理401或403的此类响应

Observable

答案 3 :(得分:0)

查看有角度的文档:https://angular.io/guide/http

所以你做什么:

this.http.get(url, { observe: 'response' }).subscribe(resp => resp.headers.get('location'))

放置在位置重定向URL中