在Angular 4中关闭窗口时注销

时间:2017-11-09 10:24:32

标签: angular http synchronous

我有一个Angular 4应用程序,我想在用户关闭页面时(浏览器的窗口或选项卡)调用注销功能。

这是我的退出功能:

    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());
}

在我的app.component.ts中,我有:

@HostListener('window:beforeunload', ['$event'])
beforeUnloadHander(event) {
    this.authenticationService.logoutOnClose().subscribe(res=> {
        localStorage.removeItem('currentUser');
    });

}

但窗口关闭,请求永远不会完成。我想我需要同步执行请求,但我不知道该怎么做。

你有什么想法吗?

修改 我试过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 });
}

5 个答案:

答案 0 :(得分:4)

我找到了怎么做。所以,我宁愿避免使用Angular的jQuery,但是像Sriram Jayaraman一样,我没有找到任何其他方法来解决我的问题。但是@HostListener('window:beforeunload')@HostListener('window:onunload')函数无效。

所以,在我的app.component.ts的ngOnInit中,我为窗口添加了一个beforeunload的事件监听器,如果用户已连接,我调用一个调用ajax的函数。

这是我的代码:

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 });
}

答案 1 :(得分:2)

您可以将用户和凭据存储在sessionStorage而不是localStorage中。关闭标签/浏览器后,sessionStorage会被移除localStorage

答案 2 :(得分:0)

为什么要在离开时断开用户与您的联系。但是如果你想这样做,你必须使你的代码和逻辑适应框架,而不是相反。

这意味着您必须在用户再次登录时重写用户会话,或者拥有删除未使用会话的作业。

但是在这两种方式中,您所要做的就是删除localStorage / SessionStorage。如果你这样做,这将对用户透明,它只是你在服务器上管理它将如何改变(但用户不知道)

答案 3 :(得分:0)

您可以将任何必须执行的代码添加到OnDestroy

中的app.component.ts功能
export class AppComponent implements OnDestroy {
    ngOnDestroy(): void {
        this.authenticationService.logoutOnClose().subscribe(res=> {
            localStorage.removeItem('currentUser');
    });
}

但是我不确定这将如何处理异步调用..但值得尝试。

答案 4 :(得分:-1)

您可以做的是,使用jQuery对此部分进行API调用同步,并根据需要使其同步。这很容易,也很好。