为了退出用户,我总是使用以下几行:
<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
。
任何人都可以帮我解决这个奇怪的案例吗?
答案 0 :(得分:7)
已经对与域名相关的<cfcookie>
行为进行了深入的讨论。以下帖子提到解决方法似乎使用<cfheader>
来处理cookie:
why doesn't cfcookie allow setting domain= to a subdomain for CFID/CFTOKEN?
在发布该问题之后,Henry实际上在Adobe上输入了一个错误:
https://bugbase.adobe.com/index.cfm?event=bug&id=3593673
您可以将您的评论/投票添加到错误中。
虽然我相信这些引用会回答您关于您所看到的<cfcookie>
行为的问题,但如果您只关注“过期”用户的会话,那么Scott's answer会为您提供更好的方法来使您失效用户当前的会话,而不是手动设置cookie。
答案 1 :(得分:5)
在ColdFusion 10中,您可以使用sessionInvalidate()
来完成此任务。您也不必担心删除cookie。