使用Parse Javascript SDK时,用户会话在页面更改时变为空

使用Parse Javascript SDK时,用户会话在页面更改时变为空,javascript,parse-platform,Javascript,Parse Platform,我正在制作一个使用Javascript Parse SDK的网站,并调用Parse.User.current()仅在某些时候有效,导致我的重定向将用户踢回登录页面,即使尚未调用Parse.User.logOut()。我使用的是用户类,没有让他们通过Facebook登录 函数以查看是否存在活动会话。如果有,则加载页面,否则应将用户重定向到主页: function checkUser(){ var currentUser = Parse.User.current(); if (cur

我正在制作一个使用Javascript Parse SDK的网站,并调用
Parse.User.current()
仅在某些时候有效,导致我的重定向将用户踢回登录页面,即使尚未调用
Parse.User.logOut()
。我使用的是用户类,没有让他们通过Facebook登录

函数以查看是否存在活动会话。如果有,则加载页面,否则应将用户重定向到主页:

function checkUser(){
    var currentUser = Parse.User.current();
    if (currentUser) {
       //the page loads
    } else {
       //redirect user to the login page
       window.location = 'login-url';
    }
}
在每页的
标记中调用上述代码:

checkUser()

当用户登录时,我检查以确保
Parse.user.current()
不为空,然后将它们重定向到主页面。第一次将它们发送到主页面时,
checkUser()
函数找不到用户,它们被发送回登录页,在登录页上,my
redirect()
函数(下面)将它们发送回主页面,因为
Parse.user.current()
在检查时不为空。第二次将它们发送到主页时,
Parse.User.current()
有一个用户,因此它们会留在这个页面上

对于登录的用户来说,上述情况不是问题,因为登录后,它们会出现在正确的页面上,但当用户尝试使用选项卡导航到其他页面时,真正的问题就会出现。单击其中一个按钮时,新页面上的
checkUser()
找不到用户,因此用户被推回登录页面,其中
redirect()
确实找到了用户,并将其发送回主页面,在主页面上
checkUser()
也找到了用户,因此它们再次返回主页面

我不知道问题是什么,但我认为这与最初以编程方式更改页面有关,因为如果我登录,然后在地址栏中键入不同页面的url,而不是单击选项卡,则
checkUser()
会找到一个用户,然后我可以使用选项卡切换页面而不会出现问题。此外,当我在使用Chrome时(Firefox总是会出现这个问题),当我注销并重新登录时,同样的问题会再次出现,这一切偶尔都会非常完美

我的登录码:

$("#login").submit(function(event){
     event.preventDefault();
     var name=$("#username").val();
     var password=$("#password").val();
     Parse.User.logIn(name, password, {
           success: function(user){
                if(Parse.User.current()){
                     window.location="main-page";
                 } else{
                      alert("no user");
                 }
           }, error: function(user, error){
                 alert("login error:" + error.message);
           } 
    });
});
在登录页面上调用重定向:

function redirect(){
    var currentUser = Parse.User.current();
    if (currentUser) {
         //a user is found, so they are taken to the main page
         window.location = 'main-page';
    } else {
         //the user has to log in
    }
}

我可以通过将userid存储在cookie中而不是依赖
Parse.User.current()
来解决问题。我基本上只是按照中概述的步骤进行操作,因为我使用的登录函数有一个对象回调,所以当用户使用
user.id
登录时,我可以很容易地获取用户id

 function setCookie(cname, cvalue, exdays) {
     var d = new Date();
     d.setTime(d.getTime() + (exdays*24*60*60*1000));
     var expires = "expires="+d.toUTCString();
     document.cookie = cname + "=" + cvalue + "; " + expires;
 }

 function getCookie(cname) {
     var name = cname + "=";
     var ca = document.cookie.split(';');
     for(var i=0; i<ca.length; i++) {
         var c = ca[i];
         while (c.charAt(0)==' ') c = c.substring(1);
         if (c.indexOf(name) == 0) return c.substring(name.length,c.length);
     }
     return "";
 }

 function checkCookie() {
     var user = getCookie("userid");
     if (user != "") {
         //stay on page
     } else {
         window.location.href="login-url";
     }
 }

 function removeCookie() {
      setCookie("userid", "", -1); //setting the userid to an empty string 
      //and setting the expiration time to have passed
 }
在所有需要用户登录的页面上,我通过调用
checkCookie()来检查cookie
中。在登录页面上,我还有一个重定向,这样,如果用户已登录,他们将被重定向到主页。此函数与
checkCookie()
相同,但我在有用户时重定向,而不是在没有用户时重定向

 function checkCookie() {
     var user = getCookie("userid");
     if (user != "") {
         window.location.href="main-page-url";
     }
 }

当用户注销时,我仍然调用
Parse.user.logOut()但我也调用
removeCookie()

我能够通过将用户ID存储在cookie中而不是依赖于
Parse.User.current()
来解决问题。我基本上只是按照中概述的步骤进行操作,因为我使用的登录函数有一个对象回调,所以当用户使用
user.id
登录时,我可以很容易地获取用户id

 function setCookie(cname, cvalue, exdays) {
     var d = new Date();
     d.setTime(d.getTime() + (exdays*24*60*60*1000));
     var expires = "expires="+d.toUTCString();
     document.cookie = cname + "=" + cvalue + "; " + expires;
 }

 function getCookie(cname) {
     var name = cname + "=";
     var ca = document.cookie.split(';');
     for(var i=0; i<ca.length; i++) {
         var c = ca[i];
         while (c.charAt(0)==' ') c = c.substring(1);
         if (c.indexOf(name) == 0) return c.substring(name.length,c.length);
     }
     return "";
 }

 function checkCookie() {
     var user = getCookie("userid");
     if (user != "") {
         //stay on page
     } else {
         window.location.href="login-url";
     }
 }

 function removeCookie() {
      setCookie("userid", "", -1); //setting the userid to an empty string 
      //and setting the expiration time to have passed
 }
在所有需要用户登录的页面上,我通过调用
checkCookie()来检查cookie
中。在登录页面上,我还有一个重定向,这样,如果用户已登录,他们将被重定向到主页。此函数与
checkCookie()
相同,但我在有用户时重定向,而不是在没有用户时重定向

 function checkCookie() {
     var user = getCookie("userid");
     if (user != "") {
         window.location.href="main-page-url";
     }
 }

当用户注销时,我仍然调用
Parse.user.logOut()但我也调用
removeCookie()
在重定向到登录屏幕之前。

此解决方案解决了导航问题,但我想知道您是否仍然能够执行任何非公共类相关活动此解决方案解决了导航问题,但我想知道您是否仍然能够执行任何非公共类相关活动