我的Angularjs应用程序上的浏览器后退按钮存在问题。这是基本设置。我们在客户端计算机上执行令牌验证的多个页面(实际上是......)。以下是一个这样的状态的例子:
theApp.controller('someController',
['$scope', '$http', '$state', '$stateParams', '$log', 'authenticationFactory','myFactory',
function ($scope, $http, $state, $stateParams, log, authenticationFactory, myFactory) {
log.debug('someController');
authenticationFactory.validateToken()
.then(success => {
return filesFactory.getFileContentDetails($stateParams.fileId);
})
.then(response => {
$scope.stuff = response;
})
.catch(error => {
$state.go('login', { error });
})
.finally(() => {
spinnerFactory.hide('loading');
});
}]);
以下是已定义登录状态的片段:
$stateProvider
.state('login', {
url: '/login',
templateUrl: 'pages/login/login.html',
controller: 'loginController',
params: {
error: null
}
}).state('someresource', {
url: '/someresource/:fileId',
templateUrl: 'pages/someresource/someresource.html',
controller: 'someController'
});
并且,以下是一些登录控制器:
theApp.controller('loginController',
['$scope', '$state', '$log', 'authenticationFactory', 'statusPopupFactory',
function ($scope, $state, log, authenticationFactory, statusPopupFactory) {
log.debug('loginController');
if ($state.params.error) {
log.error($state.params.error.data);
statusPopupFactory.setStatus('danger', $state.params.error.data);
} else if (localStorage.token) {
authenticationFactory.validateToken()
.then(user => {
$state.go('home');
})
.catch(error => {
log.error(`Token validation error: ${error.data}`);
});
}
}]);
就这样,一切都表现得应该......可以登录,状态转换等。您可以直接点击URL,这会调出由someController
控制的状态,而不是通过正常的应用程序菜单系统(即,我可以导航到由someController
运行的https://theApp/someresource/1。
当这样做,并且他们没有令牌(或者它已过期或其他任何原因......)时,他们会遇到状态登录。此时,如果他们回到浏览器,浏览器会尝试将它们重定向到它们来自的先前状态,而不是它们来自的网站。当它试图转到之前的状态时,它只是尝试重新验证令牌,失败,然后再将它们反弹回登录状态。所以这是一个循环循环。
问题是,此时从“登录”页面,他们实际上无法导航回以前的网站。感觉他们被“困在”网站中,除非您只是手动更改网址或关闭标签等,否则永远不会退出登录页面。
我该如何解决这个问题?
我最初的想法是,当登录状态加载时,我可以以某种方式查看所有浏览器历史记录,并删除应用程序的所有先前状态,但保留不是来自同一主机URL的任何状态。从登录方式来看,他们可以“浏览回来”就好了。然而,我已经筋疲力尽地试图解决这个问题......因此我就是这样。