Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 角度JS-防止控制器运行_Angularjs_Angularjs Routing_Angularjs Controller - Fatal编程技术网

Angularjs 角度JS-防止控制器运行

Angularjs 角度JS-防止控制器运行,angularjs,angularjs-routing,angularjs-controller,Angularjs,Angularjs Routing,Angularjs Controller,因此,我正在做一个简单的“用户是否已登录”检查,如果用户未登录,则将其重定向到sign.html页面。我的代码如下所示: var myAppModule = angular.module('myApp', ['ngRoute', 'ngCookies']); myAppModule.config(function($routeProvider) { $routeProvider .when('/page2', { controller:'pagetwo', templateUr

因此,我正在做一个简单的“用户是否已登录”检查,如果用户未登录,则将其重定向到sign.html页面。我的代码如下所示:

var myAppModule = angular.module('myApp', ['ngRoute', 'ngCookies']);

myAppModule.config(function($routeProvider) {
$routeProvider
.when('/page2', {
    controller:'pagetwo',
    templateUrl:'pagetwo.html'
})
.when('/signin', {
    controller:'signinCTRL',
    templateUrl:'signin.html'
})

});

myAppModule.run(function($rootScope, userInfo, $location) {
$rootScope.$on('$routeChangeSuccess', function () {
    myCurrentRoute = $location.$$path;

    if(myCurrentRoute != "/signin") {
        userInfo.checkLogin(); //  Check login first. This has the $location.path( "/signin" ); in it.
    }
})

});
我的问题是,当用户转到/page2时,$routeChangeSuccess函数会很好地启动,在userInfo.checkLogin()中,我将它们重定向到一个新的路由,该路由会在signin.html页面上重定向它们

问题是,在用户被重定向到signinCTRL控制器之前,pagetwo控制器仍会触发

   $rootScope.handleHttpFailure = function(data,status) {
        if (401 == status) {
            document.location.reload(true);
        }  else {
            console.log("post ERROR status:" + status + " response:" + data);
            $rootScope.alert('Error received status:'+ status + " response:" + data );
        }
    }

是否有办法阻止pagetwo控制器以某种方式运行?我知道我可能只需将所有内容包装在signinCTRL中,以检查用户是否登录,但这与routeChangeSuccess函数的目的背道而驰。

我已经处理过这个问题,登录功能是由我的angular js应用程序之外的servlet处理的

我通过javax.servlet.Filter控制对应用程序的访问

我还有另一个过滤器,用于来自应用程序的所有Json请求

对于未经验证的用户场景,Json过滤器的行为如下:

 httpResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED); //401
我添加了一个$rootScope方法,强制从JSON控制器登录任何401响应

   $rootScope.handleHttpFailure = function(data,status) {
        if (401 == status) {
            document.location.reload(true);
        }  else {
            console.log("post ERROR status:" + status + " response:" + data);
            $rootScope.alert('Error received status:'+ status + " response:" + data );
        }
    }

因此,对于您的场景,您不能阻止pagetwo控制器运行,但如果您遵循这一相当简单的模式,您可以阻止它访问安全资源。

$routeChangeStart
而不是
$routeChangeSuccess
事件可能会在短期内解决您的问题。您还可以在其中一个路由
resolve
map promissions中执行登录检查,并仅返回登录失败的承诺解除。然后,收听$routeChangeError可以导航到
登录
url,或者直接从resolve promise导航到它

对于一个更完整的rubust路由解决方案,您可能应该使用任何严肃的angular应用程序都应该使用的路由器(据传将来会进入angular core)


是的,您还应该在服务器端验证正确的登录和授权,并在无效时返回401响应(然后你可以使用Wonder来处理错误。但是我不同意你应该只在服务器端做这件事,这很容易让用户体验糟糕,你当然应该在客户端做基本的测试,而不是看
$routeChangeSuccess
,你可以看这个事件

$locationChangeStart
在调用控制器之前被激发

有关
$locationChangeStart
$routeChangeStart
之间差异的更多信息,请访问


使用
$locationChangeStart

这里是处理错误的最佳方法,并且可以很好地工作

function ($routeProvider, $locationProvider, $httpProvider) {
    var interceptor = [
        '$rootScope', '$q', function (scope, $q) {

            function success(response) {
                return response;
            }

            function error(response) {
                var status = response.status;

                if (status == 401) {
                    var deferred = $q.defer();
                    var req = {
                        config: response.config,
                        deferred: deferred
                    };
                    window.location = "/";
                }

                if (status == 404) {
                    var deferred = $q.defer();
                    var req = {
                        config: response.config,
                        deferred: deferred
                    };
                    window.location = "#/404";
                }
                // otherwise
                //return $q.reject(response);
                window.location = "#/500";
            }

            return function (promise) {
                return promise.then(success, error);
            };

        }
    ];
    $httpProvider.responseInterceptors.push(interceptor);
});

// routes
app.config(function($routeProvider, $locationProvider) {
    $routeProvider
        .when('/404', {
            templateUrl: '/app/html/inserts/error404.html',
            controller: 'RouteCtrl'
        })
        .when('/500', {
            templateUrl: '/app/html/inserts/error404.html',
            controller: 'RouteCtrl'
        })

        ......

   };

好奇您为什么要这样做。如果用户导航到一个他们无权查看的页面,您应该让服务器返回403错误。然后您可以捕获该错误并重定向到登录页面。@BenFelda-真的,所有真正的用户身份验证都是通过PHP在服务器端进行的。JS不可能调用pages/fil没有经过授权的php会话,我只关心抛出不需要发生的错误。这个特殊的项目也是我使用Angular的一次学习经历。这正是我想要的。谢谢。