У меня есть другое решение: это решение отлично работает, когда у вас есть только контент, который вы хотите показать при входе в систему. Определите правило, в котором вы проверяете, вошли ли вы в систему, а не путь к маршрутам из белого списка.
$urlRouterProvider.rule(function ($injector, $location) {
var UserService = $injector.get('UserService');
var path = $location.path(), normalized = path.toLowerCase();
if (!UserService.isLoggedIn() && path.indexOf('login') === -1) {
$location.path('/login/signin');
}
});
В моем примере я спрашиваю, не вошел ли я в систему, и текущий маршрут, который я хочу направить, не является частью `/ login ', потому что мои маршруты из белого списка следующие
/login/signup // registering new user
/login/signin // login to app
, поэтому у меня есть мгновенный доступ к этим двум маршрутам, и любой другой маршрут будет проверен, если вы находитесь в сети.
Вот весь мой файл маршрутизации для модуля входа в систему
export default (
$stateProvider,
$locationProvider,
$urlRouterProvider
) => {
$stateProvider.state('login', {
parent: 'app',
url: '/login',
abstract: true,
template: '<ui-view></ui-view>'
})
$stateProvider.state('signin', {
parent: 'login',
url: '/signin',
template: '<login-signin-directive></login-signin-directive>'
});
$stateProvider.state('lock', {
parent: 'login',
url: '/lock',
template: '<login-lock-directive></login-lock-directive>'
});
$stateProvider.state('signup', {
parent: 'login',
url: '/signup',
template: '<login-signup-directive></login-signup-directive>'
});
$urlRouterProvider.rule(function ($injector, $location) {
var UserService = $injector.get('UserService');
var path = $location.path();
if (!UserService.isLoggedIn() && path.indexOf('login') === -1) {
$location.path('/login/signin');
}
});
$urlRouterProvider.otherwise('/error/not-found');
}
() => { /* code */ }
- синтаксис ES6, используйте вместо него function() { /* code */ }
Поведение определяется реализацией, вы получите либо нулевой указатель, либо адрес. Вызов free для полученного указателя, однако, не должен вызывать проблем, поскольку:
Разрешено возвращать NULL, и разрешено возвращать указатель, отличный от NULL. вы не можете разыменовать. Оба способа санкционированы стандартом (7.20.3):
Если размер запрошенного пространства равен нулю, поведение определяется реализацией: возвращается либо нулевой указатель, либо поведение такое, как если бы размер был ненулевым значением, за исключением того, что возвращаемый указатель не должен использоваться для доступа к объекту.
Извините за проблему, мне следовало прочитать страницы руководства:
malloc () выделяет байты размера и возвращает указатель на выделенную память. Память не очищается. Если размер равен 0, то malloc () возвращает либо NULL, либо уникальное значение указателя, которое позже может быть успешно передано в free ().
free () освобождает пространство памяти, на которое указывает ptr, которое должно было быть возвращено предыдущим вызовом malloc (), calloc () или realloc (). В противном случае, или если free (ptr) уже был вызван ранее, возникает неопределенное поведение. Если ptr равен NULL, никакие операции не выполняются.
Кажется, это верно по крайней мере для GNU libc
Обновлено с учетом комментариев libt и Pax:
Поведение вызова malloc (0) зависит от реализации или, другими словами, не переносится и не определено.
Ссылка на CFaq вопрос для получения дополнительных сведений.
Согласно стандарту c
7.20.3 Если размер запрошенного пространства равен нулю, поведение определяется реализацией: либо возвращается нулевой указатель, либо поведение такое, как если бы размер был некоторым ненулевым значением, за исключением того, что возвращаемый указатель не должен использоваться для доступа к объекту.
Хотя это может быть законный C / C ++, это указывает на более серьезные проблемы. Я обычно называю это «неряшливостью указателя».
См. «Не делайте предположений о результате malloc (0) или calloc (0)», https://www.securecoding.cert.org/confluence/display/seccode/VOID+MEMxx-A . + Не + делать + предположения + о + результате + malloc% 280% 29 + или + calloc% 280% 29 .