2014-02-12 89 views
7

我有一个ColdFusion页面,用户可以打开模式并查看有关一行数据的更多信息。但是,如果用户坐在页面上的时间超过默认的20分钟会话超时时间,则会发出错误,因为它正在查找会话变量并找不到它们。我理解如何用服务器端代码来捕获这个问题,但我似乎无法获得AJAX调用来成功确定会话是否仍然存在。使用AJAX时检查会话超时

这里是AJAX代码,当用户点击按钮打开模式时触发。基本上它是检查会话是否与CFC中的函数存在。我的问题是,它总是返回'有效'。

//this checks if the session is expired 
function checkSessionExists() { 
    $.ajax({ 
     //this is the that has function 
     url: 'components/Admin.cfc', 

     //POST method is used 
     type: "POST", 
     //pass the data   
     data: { 
      method: "checkSessionExists" 
      }, 
     async: false, 
     success: function(response) { 

      //$('#loading').hide(); 
      var obj = $.trim(response); 

      if (obj == 'expired') { //it's never expired 
       alert('Sorry, your session has expired.') 
       window.location.href = "logout.cfm"; 
       return false; 
      } 

      else{ 

      } 
     }, 
     error: function(jqXHR, exception) { 
      alert('Uncaught Error.\n' + jqXHR.responseText); 
     } 
    }); 
return false; 
} 

这里是在CFC功能:我在想,当我问CFC会话是否存在,它仍然有会话变量,因为页面没有刷新

<cffunction name="checkSessionExists" access="remote" output="false" returntype="string" returnformat="plain" hint="I check if session is expired."> 

    <cfif NOT structKeyExists(session, "alive")> 
     <cfreturn "expired" /> 
    <cfelse> 
     <cfreturn "valid" /> 
    </cfif> 

</cffunction> 

在二十分钟内。所以...想知道如何将一个AJAX请求发送给CFC并在CFC中有一个函数重新评估会话变量。任何帮助,将不胜感激谢谢!

回答

4

我将取决于您如何设置session.alive值。请记住,只要活动存在于会话中,您的代码就会返回“有效”。如果在会话初始化代码中设置session.valid,您将得到您所看到的响应。

对.cfm的任何请求都会导致会话超时值重置为now()+会话持续时间。我过去曾经使用过这个功能:

  1. 监听键盘或点击页面上的事件。如果发生任何此类事件,请设置布尔标志
  2. 每隔几分钟一次,检查该值并发送ajax调用以保持会话处于活动状态(如果该值为true)。然后您将变量设置为假

然后循环重复。这意味着如果您的用户正在与网站互动,他们的会话将保持开放,并且在他们正在做的事情结束时不会被抛出。如果您的企业/网站会话政策允许,这可以是一个非常好的设置。

+0

+1你打我10秒;)(我将删除我的答案,因为我们基本上是说同样的事情) –

+1

hehe对不起。如果它不适用于Chrome StackTrack插件,我将无法及时回答任何问题 – barnyr

+0

我必须做类似的事情。我使用了一个像素iframe,对用户不可见。 Inside是一个带有元刷新标签的Coldfusion页面。请注意,这种方法意味着用户无需在浏览器上执行任何操作。这是故意的。这可能不适合你的情况,但它适用于我的情况。 –