ColdFusion SessionTracker并强制结束会话

ColdFusion SessionTracker并强制结束会话,session,coldfusion,coldfusion-9,Session,Coldfusion,Coldfusion 9,我使用ColdFusion 9ColdFusion.runtime.SessionTracker来监视当前登录的用户,使用以下代码 app = application.getApplicationSettings().name; sessiontracker = createObject("java","coldfusion.runtime.SessionTracker"); sessionCollection = sessionTracker.getSessionCollection(app)

我使用ColdFusion 9
ColdFusion.runtime.SessionTracker
来监视当前登录的用户,使用以下代码

app = application.getApplicationSettings().name;
sessiontracker = createObject("java","coldfusion.runtime.SessionTracker");
sessionCollection = sessionTracker.getSessionCollection(app);
它返回所有当前活动会话的
jsessionid
struct
,以及会话变量

如果我有
jsessionid
有效地强制用户注销,是否可以强制会话结束

谢谢


Richard

您是否尝试过在application.cfc中使用onSessionEnd?因为我们可以在注销过程中手动启动它,或者在用户关闭浏览器或其他功能正常的情况下自动启动。这就是我们使用它的方式

在application.cfc中,我们启动onSessionEnd,它启动同样在application.cfc中的注销功能,并执行所有清洁工作和日志记录

<cffunction name="OnSessionEnd" access="public" returntype="void"
                 output="false" hint="Fires when the session is terminated.">
        <cfargument name="SessionScope" type="struct" required="true" />
        <cfargument name="ApplicationScope" type="struct"
                                  required="false" default="#StructNew()#" />
        <cfargument name="timedOut" type="boolean" required="false" default="true">
                <cfinvoke thisSessionScope="#SessionScope#"
                      timedOut="#arguments.timedOut#" method="logout">
                </cfinvoke>
            <cfset structClear(arguments.sessionScope) >
         <!--- Return out. --->
        <cfreturn />
    </cffunction>


希望这有助于

所以当用户登录时,我会在他们的会话中设置一个
用户
结构,以便删除他们的登录状态。使用
sessionTracker
我可以获得特定用户的会话,只需删除当前会话中的
user
结构即可

app = application.getApplicationSettings().name;
sessiontracker = createObject("java","coldfusion.runtime.SessionTracker");
sessionCollection = sessionTracker.getSessionCollection(app);

userSession = sessiontracker.getSession(app, sessionID));

structDelete(userSession, "user");

不确定这是否是最好的方法,但它似乎对我有效。希望它能帮助人们。

您能详细说明您需要这样做的原因吗?有很多关于结束会话的博客条目。根据您的需要,可能有比使用内部类更好的选项。但要回答您的问题,请转储SessionTracker对象。有一个
cleanUp(appName,sessionID)
方法可以做到这一点。虽然我自己从来没有用过,但很抱歉我的回复太晚了,我只是想重新开始这个项目。我已转储SessionTracker对象,但没有
清理(appName,sessionID)
方法。不,它在那里。它被列为
cleanup(java.lang.String,java.lang.String)
。第一个参数是应用程序名称,第二个参数是会话ID。不确定要查看的位置,请参阅此处以获取
SessionTracker
对象的转储。您正在运行ColdFusion 10吗?对于任何发现此问题并尝试在CF10及更高版本中运行它的人,您可能会发现第一行代码不起作用。您可以改为使用:app=getapplicationmetadata().name;如果你逐字逐句地回答这个问题,他是在试图迫使会议结束。OnSessionEnd在实际发生之前不会运行。当然,在他问的和他真正想要的之间可能存在差异。比如在onSessionEnd(他说他有会话id)中?我从来没有理由去尝试。很抱歉我的回复太晚了,只是刚刚开始着手这个项目。我已经找到了一种手动调用事件处理程序
onSessionEnd()
的方法。然而,我发现了一种使用户登录状态无效的非常简单的方法。请参阅答案。当我的网站安装在Windows 2003上时,这非常有效。现在,尝试将它们移动到Windows 2008R2,cleanup()方法消失,并尝试将会话分配给变量,这将导致500服务器错误。