我使用Spring Security,它将未经身份验证的用户重定向到登录页面。
因此,当未经身份验证的角度客户端向端点(期望JSON)发送GET请求时,它将接收登录页面的HTML内容,并且JSON解析器失败(Angular2 watch for 302 redirect when fetching resource)
get_add_if_missing
如何在Angular中处理重定向?
答案 0 :(得分:0)
这不是很干净,我建议使用Router
和Guards
处理路由和状态。但是,如果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中