我在我的网站上设置了Facebook Connect,登录工作正常。我已经设置了一个侦听器来检测登录状态更改,如下所示:
FB.Event.subscribe('auth.sessionChange', function() {
window.location.reload();
});
一切都好。除了打开浏览器窗口导致页面在大约20分钟后重新加载。因此,auth.sessionChange会以某个间隔触发。这可能造成严重破坏,特别是如果最后一页是POST表单提交。
在FB文档中,它说“只要用户对您的应用程序处于活动状态,会话就会随着时间的推移而刷新”。这次会议多久刷新一次?
如果不需要,我如何保护页面不被重新加载?条件可能在该函数内吗?
编辑 - 添加澄清信息:
我想我会添加一些信息,以便为那些提供更多建议的人提供更多信息(感谢迄今为止BTW):
我让侦听器触发重新加载的原因是因为我希望用户每次访问时都登录到站点 - 如果他们已经在FB中进行了会话。我正在检测JS SDK的活动会话,我知道它可以自己登录,但我需要在JS完成检测后触发页面重新加载,以便为站点设置PHP会话 - 必需步。如果没有让JS在浏览器中检测到FB会话,我就无法进行PHP登录。
答案 0 :(得分:0)
通常只需查看会话本身就可以看到会话有效期的长度。但是在许多情况下,我建议请求offline_access权限,以确保只要用户不更改密码并且不删除您的应用程序,access_token仍然有效。
答案 1 :(得分:0)
Andy,如果您只是在侦听登录状态,请订阅 auth.login 和 auth.logout ,而不是 auth.sessionChange 。
如果您需要活动会话以供用户在您的网站上执行操作,请使用 FB.getLoginStatus()或 FB.getSession()来检查会话对象
http://developers.facebook.com/docs/reference/javascript/FB.getLoginStatus/
http://developers.facebook.com/docs/reference/javascript/FB.getSession/
答案 2 :(得分:-1)
这实际上取决于您的App工作流程,以下只是一般方法。
您可以在所有页面中显示一个标志(如果您使用的是模板系统,可能在主布局中),并且一旦您不需要重新加载页面,就可以执行setter函数。类似的东西:
var do_reload = true; // By default, we always allow a reload
FB.Event.subscribe('auth.sessionChange', function() {
if( do_reload ) {
window.location.reload();
}
});
// Call this whenever you don't want 'auth.sessionChange' to reload the page
function turnoff_reload() {
do_reload = false;
}
// Call this to return to default behavior
function turnon_reload() {
do_reload = true;
}
现在,如果您将用户(例如:在表单发布后)“重定向”到不需要重新加载的页面,则需要将第一行中的标志设置为false
。
另一种情况是,如果你有一个基于用户交互的ajax加载内容,如果页面自己重新加载内容将丢失并且用户需要再次交互以查看该内容,那么可以在这里做的是设置标志在Ajax调用之后到false
。