【发布时间】:2014-04-29 22:08:26
【问题描述】:
我正在开发一个登录应用程序,其中我与 REST 接口进行角度通信以验证用户身份。我正在使用 $http 来完成这项任务。现在,我需要将我的页面重定向到另一个 URL(这可能在相同或不同的域上)。另外,我需要在此过程中设置标题。
请帮助我实施以继续执行此任务。
【问题讨论】:
标签: angularjs
我正在开发一个登录应用程序,其中我与 REST 接口进行角度通信以验证用户身份。我正在使用 $http 来完成这项任务。现在,我需要将我的页面重定向到另一个 URL(这可能在相同或不同的域上)。另外,我需要在此过程中设置标题。
请帮助我实施以继续执行此任务。
【问题讨论】:
标签: angularjs
1) AngularJs 旨在构建 SPA,您不应重定向到另一个 url。您应该重定向到当前页面中的另一个路径。如果您使用angular router,您将重定向到另一个状态。看看这个以获取更多信息:single page application deep linking with login page
2) 因为浏览器会自动处理 302 响应并强制您的 ajax 函数向 Location 发送另一个 ajax 请求以检索状态为 200 的最终结果。您的服务器应该返回 401 当用户没有被授权时。 Cannot handle 302 redirect in ajax and why?
客户端处理 401 状态码的示例代码(未授权):
$rootScope.$on('$stateChangeError', function(event, toState, toParams, fromState, fromParams, error){
if (error.status == 401) { // check for 401 status code
$state.transitionTo("login", { returnUrl: $location.url() });
}
})
另一个带有 $http 的示例代码,我建议在 interceptors 中全局执行它
$httpProvider.interceptors.push(function($q, $location) {
return {
'responseError': function(response) {
if(response.status === 404){
$location.path('your redirection path');
}
return $q.reject(response);
}
};
});
3) 为了设置您的请求标头,您可以在 $httpProvider.defaults.headers 或 per request 中全局设置它
【讨论】:
window.location.href,关键是你在使用ajax时必须处理401而不是302。要在同一页面中重定向,只需使用 $state 或 $location
如果您需要转到另一个页面,请使用直接 java 脚本
window.location.href=......
【讨论】:
您是否考虑过阅读 Angular documentation / API?
使用$location 服务进行重定向并阅读 $http 文档以了解如何设置标头。
引用:
$http 服务会自动为所有请求添加特定的 HTTP 标头。这些默认值可以通过访问 $httpProvider.defaults.headers 配置对象来完全配置 [...]
SO 社区中的任何人都不太可能为您的问题提供完整的指南,因为所需的信息很容易获得。
【讨论】:
$http 请求中,但是如何在重定向 $location 中做到这一点?