3

为了注销用户,我总是使用以下几行:

<cfset structClear(SESSION)>
<cfcookie name="CFID" value="" expires="NOW">
<cfcookie name="CFTOKEN" value="" expires="NOW">

它在运行时清除会话中保存的数据并重置/更新 CFID 和 CFTOKEN。它仍然可以在我们的旧服务器(ColdFusion 8)上运行,但它不再适用于我们的新服务器(ColdFusion 10)。此尝试在 ColdFusion 10 中失败的原因相当简单:每当我尝试覆盖 CFID 或 CFTOKEN(带有<cfcookie>)时,cookie 都会放在顶级域中,例如:

Cookie set via <cfcookie> on ColdFusion 10:
domain: .myserver.com

而 ColdFusion 将其会话 cookie 放在实际的(子)域上:

Generated CFID/CFTOKEN by ColdFusion 10:
domain: mywebsite.myserver.com

有趣的是:如果我设置如下:

<cfcookie name="TEST" value="..." expires="NEVER">

cookie 正确设置为:

domain: mywebsite.myserver.com

我可以使用以下方法轻松清除 cookie:

<cfcookie name="TEST" value="" expires="NOW">

我尝试使用域属性,但是:

<cfcookie name="CFID" value="" domain="mywebsite.myserver.com" expires="NOW">

总是以:

domain: .mywebsite.myserver.com

(注意前面的点),因此不被识别为同一个 cookie。

另一个奇怪的事情是,使用:

<cfcookie name="CFID" value="" expires="NOW">

不仅会生成带有错误域的 cookie,而且会保留而不是因为过期而被删除。

我检查了 ColdFusion 10 机器上 cookie 的服务器设置,Disable updating ColdFusion internal cookies using ColdFusion tags/functions但未检查该属性。

谁能帮我解决这个奇怪的情况?

4

2 回答 2

7

已经对<cfcookie>相关域的行为进行了一些深入的讨论。以下帖子提到该解决方法似乎用于<cfheader>处理 cookie:


虽然我相信这些参考资料回答了您关于<cfcookie>您所看到的行为的问题,但如果您只关心“过期”用户的会话,那么Scott 的回答为您提供了一种比手动设置 cookie 更好的方法来使用户的当前会话无效。

于 2013-08-05T16:17:37.693 回答
5

在 ColdFusion 10 中,您可以使用sessionInvalidate()来完成此操作。您也不必担心删除 cookie。

于 2013-08-05T17:12:30.387 回答