2013-12-09 26 views
0

如果用户正在关闭标签页,我需要注销用户。我试着通过在onbeforeunload方法调用一个Ajax功能做到这一点:标签关闭时,AJAX注销不起作用

$(document).ready(function() { 
     window.onbeforeunload = function() { 
      if (!validNavigation) { // I set validNavigation = true when user clicks on different internal links etc 
       LogOff(); 
      } 
     } 
    }); 

    var validNavigation = false; 

function LogOff() { 
    $.ajax({ 
     cache: false, 
     data: { }, 
     dataType: 'json', 
     url: '/Account/LogOffAjax', 
     type: 'post', 
     success: function (resp) { 
      if (resp.IsSuccessful) { 
      } 
      else { 
       alert(resp.ExceptionKey); 
      } 
     }, 
     error: function (data) { 
      alert('unknown error'); 
     } 
    }); 

}; 

方法,无需内部(由调试器检查)任何异常LogOffAjax来电,但用户停留登录如果我调用此方法时。用户只需点击链接(不关闭标签) - 用户已注销(因此方法正确)。我认为当标签关闭时cookie不能被清除(但是为什么服务器“认为”用户仍然登录很奇怪)。

我该如何解决这个问题?

回答

2

默认情况下,服务器不会跟踪登录的用户。随所有请求一起提交的.ASPXAUTH cookie将被检查以查看用户是否仍然通过身份验证。

如果用户的浏览器会话结束,服务器无法删除其.ASPXAUTH cookie。如果您想确保它正常工作,您可以在LogOff函数或beforeunload处理程序中从客户端删除Cookie。

编辑:根据您正在使用ASP.NET MVC的是什么版本的,你可能会寻找在.AspNet.ApplicationCookie

+0

好的,哪个cookie名称需要清除? –

+1

'.ASPXAUTH' - 应该存在。可以?无论是那个还是'​​.AspNet.ApplicationCookie',如果你使用的是ASP.NET MVC 5 – damienc88

2

阿贾克斯在onbeforeunload方法执行必须是同步请求,否则将无法前完成重定向发生。

... 
async: false, 
... 

另请注意,您的成功和错误警报不会发生。