0

我正在使用 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>

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

4

2 回答 2

2

实际上,我只是在我们自己的应用程序中遇到了这个问题。在我们的问题中,我们正在处理由于会话超时而丢失/为空的 REQUEST 变量。用户将提交到 acfgrid并且编辑将发布不正确/丢失的数据。

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

在 CFC 方法中:

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

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

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) ;               
    }           
};
于 2013-01-08T21:35:39.340 回答
1

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

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

于 2013-01-08T22:39:32.000 回答