实际上我正在Ionic2中创建一个应用程序,我在其中将我的根页面设置为登录页面,用户在其中添加了凭据,并且成功登录后使用setRoot重定向到另一个页面,例如Page1。
问题是,在移动应用程序中从应用程序按下按钮关闭,用户再次被强制登录屏幕,但我想要设置其会话。
任何人都可以提出这个问题以及如何克服这个问题。
我已经将ionic2与菜单一起用作启动。
答案 0 :(得分:2)
之前我遇到过这个问题,我的解决方案是在服务中设置一个LoggedIn
状态,我会从我的后卫调用我的登录组件,重定向到主要部分该应用程序,如果我已经登录。
示例:
这个方法调用我的ASP.NET控制器来获取Session参数(事先由login
方法设置)以了解用户是否已经过身份验证,然后将相应的值设置为我的服务boolean( this.isLoggedIn
)。
<强> Auth.service.ts 强>
setupLoggedInState() {
// HTTP Request to API
let lControllerAction: string = "/IsConnectedState";
let lControllerFullURL: string = this.controllerURL + lControllerAction;
let headers = new Headers({ 'Content-Type': 'application/json' });
// Empty body (necessary for this specific call)
let options = new RequestOptions({ headers: headers, body: "" });
// Call ASP Controller
return this.http.get(lControllerFullURL, options)
.map((res: any) => {
let data = res.json();
if (data == true) {
this.isLoggedIn = true;
}
}
).catch(this.handleError);
}
这是一个让我的警卫工作的例子。我还有一些特定的代码来管理用户是否会手动输入URL,因此您不需要所有这些。
<强> Auth.guard.ts 强>
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | boolean {
// Set IsLoggedIn if user has been authenticated before
return this.authService.setupLoggedInState()
.map(loggedIn => {
// Check result
if (this.authService.isLoggedIn) {
// Managing redirection as well as manual URL input
if (state.url === '/login') {
this.router.navigate(['/master/accueil']);
}
return true;
} else {
// Allow routing to LoginComponent if not logged in
if (state.url === '/login')
return true;
// Refuse access to specific URL => Redirect to Login
this.router.navigate(['/login']);
return false;
}
});
}
我是这样做的,因为我可以使用Session变量保存状态服务器端。如果要实现此行为,则需要找到自己的方法来保存此状态。 希望这有帮助
答案 1 :(得分:0)
您可以显示弹出窗口以确认注销。
import { Platform, IonicApp } from 'ionic-angular';
constructor(public platform: Platform, private ionicApp: IonicApp){}
initializeApp() {
this.platform.ready().then(() => {
//back button handle
this.platform.registerBackButtonAction(() => {
let ready = true;
let activePortal = this.ionicApp._loadingPortal.getActive() ||
this.ionicApp._modalPortal.getActive() ||
this.ionicApp._toastPortal.getActive() ||
this.ionicApp._overlayPortal.getActive();
if (activePortal) {
//If any popup is open, dismiss it.
ready = false;
activePortal.dismiss();
activePortal.onDidDismiss(() => { ready = true; });
return;
}
else {
if (this.nav.canGoBack()) {
//You can come to parent screen by pressing back button.
this.nav.pop();
} else {
//After coming back to home screen, you can ask confirmation for logout to user.
this.confirmLogout();
}
}
});
});
}
confirmLogout() {
let confirm = this.alertCtrl.create({
title: 'Log out?',
message: 'Do you want to log out?',
buttons: [
{
text: 'No',
handler: () => {
console.log('No clicked');
}
},
{
text: 'Yes',
handler: () => {
navigator['app'].exitApp();
}
}
]
});
confirm.present();
}