J'ai une Angular 4 et je souhaite appeler la fonction de déconnexion lorsque l'utilisateur ferme la page (fenêtre ou onglet du navigateur).
Voici ma fonction de déconnexion:
let currentUser: User = JSON.parse(localStorage.getItem('currentUser'));
let headers = new Headers({ 'Authorization': 'Basic ' + btoa(currentUser.login + ":" + currentUser.password),
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Headers': 'access-control-allow-headers, access-control-allow-Origin, content-type, authorization'
});
let opts = new RequestOptions();
opts.headers = headers;
return this.http.get(this.route + 'UserLogout', opts).map((response: Response) => response.json());
}
Et dans mon app.component.ts, j'ai:
@HostListener('window:beforeunload', ['$event'])
beforeUnloadHander(event) {
this.authenticationService.logoutOnClose().subscribe(res=> {
localStorage.removeItem('currentUser');
});
}
Mais la fenêtre est fermée et la demande n'est jamais faite. Je pense que je dois faire la demande de manière synchrone mais je ne sais pas comment le faire.
Avez-vous une idée ?
MODIFIER J'ai essayé avec jQuery:
ngOnDestroy(){
let currentUser: User = JSON.parse(localStorage.getItem('currentUser'));
$.ajax({ url: 'myURL',
beforeSend: function(request) {
request.setRequestHeader("Authority", 'Basic ' + btoa(currentUser.login + ":" + currentUser.password));
request.setRequestHeader('Content-Type', 'application/json');
request.setRequestHeader('Access-Control-Allow-Origin', '*');
request.setRequestHeader('Access-Control-Allow-Headers', 'access-control-allow-headers, access-control-allow-Origin, content-type, authorization');
},
type: 'GET',
success: function (result) {
alert('test');
localStorage.removeItem('currentUser');
}, async: false });
}
J'ai trouvé comment le faire. Donc, je préférerais éviter jQuery avec Angular mais comme Sriram Jayaraman je n'ai rien trouvé d'autre pour résoudre mon problème. Mais les fonctions @HostListener('window:beforeunload')
et @HostListener('window:onunload')
ne fonctionne pas.
Ainsi, dans le ngOnInit de mon app.component.ts, j'ai ajouté un écouteur d'événements pour beforeunload
à la fenêtre et si l'utilisateur est connecté j'appelle une fonction qui fait un appel ajax.
Voici mon code:
ngOnInit() {
let context = this;
window.addEventListener("beforeunload", function (e) {
let currentUser : User = JSON.parse(localStorage.getItem('currentUser'));
if(currentUser){
context.logoutOnClose();
}
});
}
logoutOnClose(){
let currentUser: User = JSON.parse(localStorage.getItem('currentUser'));
$.ajax({ url: 'myURL',
beforeSend: function(request) {
request.setRequestHeader("Authorization", 'Basic ' + btoa(currentUser.login + ":" + currentUser.password));
request.setRequestHeader('Content-Type', 'application/json');
request.setRequestHeader('Access-Control-Allow-Origin', '*');
request.setRequestHeader('Access-Control-Allow-Headers', 'access-control-allow-headers, access-control-allow-Origin, content-type, authorization');
},
type: 'GET',
success: function (result) {
localStorage.removeItem('currentUser');
},
async: false });
}
Vous pouvez stocker votre utilisateur et vos informations d'identification dans sessionStorage
plutôt que localStorage
. sessionStorage
est supprimé à chaque fermeture de l'onglet/du navigateur, localStorage
pas!
Pourquoi voudriez-vous déconnecter votre utilisateur en partant est à vous. Mais si vous voulez le faire, vous devez adapter votre code et votre logique au framework, et non l'inverse.
Cela signifie que vous devez réécrire la session utilisateur lorsque l'utilisateur se reconnecte ou avoir un travail qui supprime les sessions inutilisées.
Mais dans les deux sens, tout ce que vous avez à faire est de supprimer votre localStorage/SessionStorage. Si vous faites cela, cela sera transparent pour l'utilisateur, c'est juste la façon dont vous le gérez sur votre serveur qui va changer (mais l'utilisateur n'aura aucune idée)
Vous pouvez ajouter tout code à exécuter à la fonction OnDestroy
dans votre app.component.ts
export class AppComponent implements OnDestroy {
ngOnDestroy(): void {
this.authenticationService.logoutOnClose().subscribe(res=> {
localStorage.removeItem('currentUser');
});
}
Cependant, je ne sais pas comment cela va gérer l'appel asynchrone .. mais cela vaut la peine d'essayer.