我决定采用方法 2:该应用程序只有 1 个页面,登录页面将是应用程序中的一个视图,该视图使用 javascript 来回切换。. 我发现这并不难,我仍然可以在服务器上使用普通的基于 cookie 的身份验证,成功登录后将用户重定向到默认页面(主页)等等。这是我如何使用 angularjs 执行此操作的示例代码。
路由:
var App = angular.module('App', ["ui.state"]);
App.config(function ($stateProvider, $routeProvider) {
$stateProvider.
.state('login', {
url: "/login?returnUrl",
templateUrl: '/Home/Login',
controller:"LoginController"
})
.state('main', {
url: "/main",
abstract:true,
templateUrl: '/Home/Main',
controller: "MainController"
})
})
.run(function ($rootScope, $state, $stateParams, $location) {
$rootScope.$on('$stateChangeError', function(event, toState, toParams, fromState, fromParams, error){
if (error.status == 401) {
$state.transitionTo("login", { returnUrl: $location.url() });
}
})
});
这里的重点是当出现状态为 401 的路由更改错误(来自服务器)表明用户未登录时,我将使用返回 url 转换到登录状态。
用户使用 ajax 成功登录后,我会将状态转换回我的主视图。像这样的东西:
$http.post("/Login", JSON.stringify({UserName:username,Password:password}))
.success(function (data, status, headers, config) {
var returnUrl = $stateParams.returnUrl ? $stateParams.returnUrl : "mydefaulturl";
$location.url(returnUrl);
})
使用这种方法,现在我可以创建深层链接以在我的应用程序中使用登录页面跳转到特定状态并返回 url。