重置ColdFusion会话变量(CFTOKEN、CFID、JSESSIONID)最有效的方法是什么?

重置ColdFusion会话变量(CFTOKEN、CFID、JSESSIONID)最有效的方法是什么?,coldfusion,coldfusion-9,Coldfusion,Coldfusion 9,下面问题的结论是,在从http切换到https后重建会话令牌是一个好主意 问题是,最有效的方法是什么 structDelete(session, "CFTOKEN"); structDelete(session, "CFID"); structDelete(session, "JESSIONID"); 将从结构中删除键,但我不确定您是否会在CF“重新应用”这些变量到会话时遇到问题。这是说起来容易做起来难的事情之一 我已经有一段时间没有对此进行研究了,因此请理解您可能需要对其进行故障排除 对于

下面问题的结论是,在从http切换到https后重建会话令牌是一个好主意

问题是,最有效的方法是什么

structDelete(session, "CFTOKEN");
structDelete(session, "CFID");
structDelete(session, "JESSIONID");

将从结构中删除键,但我不确定您是否会在CF“重新应用”这些变量到会话时遇到问题。

这是说起来容易做起来难的事情之一

我已经有一段时间没有对此进行研究了,因此请理解您可能需要对其进行故障排除

对于JavaEE会话,我认为这更容易一些,因为您可以在会话上调用invalidate()。但不幸的是,这只是战斗的一半。你确实有几个问题要解决。是的

  • 找到一些方法来存储所需的任何现有会话数据(序列化和存储)

  • 使旧会话无效(Java EE和CF会话都可以,但CF会话的方法没有文档记录)

  • 使旧饼干过期

  • 创建新会话

  • 将步骤1中存储的旧会话中的数据复制到新会话中

  • 为新会话设置新cookie

  • 这似乎不太棘手,潜在的困难部分是在一个请求中完成,因为通常在发出请求之前不会创建会话,在返回响应之前不会设置cookie

    我认为使用JavaEE是最简单的,因为您可以在旧会话上调用invalidate(),并通过调用getRequestContext().getSession()获得一个新会话(我相信情况就是这样,而且我相信它只适用于JavaEE会话)

    我已经考虑过如何使用CF会话来做这些事情,我唯一能想到的是让创建新会话的代码向站点上的页面发出CFHTTP请求,以便创建新会话。CFHTTP响应将包含一个新cookie,然后您可以使旧cookie过期,并使用标记设置新cookie


    希望这会有所帮助

    在执行了一系列测试之后,终止会话的最有效方法似乎是使用值now使jsessionid cookie过期

    <cfcookie name="jsessionid" expires="now"/>
    
    
    
    这显然假设使用J2EE会话变量

    若并没有使用J2EE会话变量,那个么会话变量和客户端变量似乎都是从CFID和CFTOKEN cookie变量中键入的。这意味着终止会话的唯一方法是使用now值使这些cookie过期

    <cfcookie name="cftoken" expires="now"/>
    <cfcookie name="cfid" expires="now"/>
    
    
    
    此方法还将使客户端变量无效


    在不使用J2EE会话变量的情况下,在不杀死客户端变量的情况下杀死会话的最佳方法似乎是创建一个在浏览器关闭时过期的会话cookie,并在application.cfc request processing下检查该值。如果值不存在,请清除会话结构。

    这只会从客户端结构中删除值。您还需要从cookie中删除它们。这一点很好。无论如何,我更喜欢杰森的答案,而不是我自己的答案DHey Jason,在CFHTTP端,响应不是来自服务器到服务器,而不是来自客户端吗?在这种情况下,客户端将无法设置新会话。和往常一样,Ben Nadel对如何强制结束会话()有一些想法,这就是第6步的目的。您从CFHTTP请求(服务器到服务器请求)收集cookie,然后手动将它们设置回浏览器。啊,明白了:),这很有意义。