如果没有实时,如何测试实时会话变量并通过JavaScript刷新?

时间:2013-01-08 21:09:39

标签: coldfusion coldfusion-8

我正在使用ColdFusion 8和jQuery。

我有一个使用大量ajax的页面。单击页面上的按钮时,会将一些数据发送到CFC以检索数据。数据检索需要会话变量。如果页面暂时未使用且会话已结束,则页面将生成错误。用户可以单击他想要的所有内容,但不会看到错误,因为它在ajax的幕后。 Firebug告诉我会话变量不再存在。这是错误:

Element USERINFO.CATALOG_ID is undefined in SESSION.

在我的CFC顶部,我将诸如APPLICATION和SESSION范围内的东西移动到VARIABLES范围,如下所示:

<cfcomponent>

    <cfscript>
    // DEFAULT DATASOURCE
    VARIABLES.DS = APPLICATION.Datasource;
    // SET CATALOG AND MARKET
        VARIABLES.Catalog_ID = SESSION.UserInfo.Catalog_ID;
    VARIABLES.CatalogType = THIS.getCatalogType(VARIABLES.Catalog_ID);
    </cfscript>

    <cffunction name='SomeFunction>
    </cffunction>

<cfcomponent>

测试会话是否仍处于活动状态的好方法是什么,如果没有,则返回页面指示刷新自身,然后重新启动此会话?

2 个答案:

答案 0 :(得分:2)

我实际上只是用我们自己的应用程序遇到了这个问题。在我们的问题中,我们处理由于会话超时而丢失/空的REQUEST变量。用户将提交cfgrid,编辑内容会显示错误/缺失数据。

我的解决方案是检查存在和正确设置的变量。如果失败,我返回错误/失败,否则正常处理继续,我返回真/成功。

在CFC方法中:

<cfif NOT structkeyexists(session,"userid") OR len(trim(session.userid)) EQ 0>
  <cfreturn false>
</cfif>
<!--- normal processing --->
<cfreturn true>

然后在主页面的回调处理程序中,我处理返回的true / false。如果失败,我会弹出一条警告消息并重新加载页面,这会自动将用户重定向回登录页面。

var myCallBackHandler = function(r) {
    if (r==true) {
      // normal success processing
    } else {
      // update failed - usually due to timeout
      alert('Your session has timed out. The data was NOT saved. Please log in and try again.') ;
      location.reload(true) ;               
    }           
};

答案 1 :(得分:1)

如果我想保持会话打开,我使用非常小的(1像素)iframe。 iframe中的页面每隔x秒执行一次元刷新,这样可以使会话保持活动状态。

话虽如此,我很少想让会话保持活力。他们超时是有原因的。我们还整合了一个javasript倒计时器,它可以在会话超时的同时将用户引导到另一个页面。在上面描述的场景中,用户将无法单击该按钮,因为它不在那里。