Lucee在使用JQuery的load()方法时会随机生成新会话

10

我有一个网页,你需要登录后才能访问,登录后会创建一个会话变量,该变量在所有后续的页面访问中都会被检查,如果它不存在或不匹配与会话ID记录的内容,则会被踢出该页面。


此处为代码: Application.cfm 会话设置:

<CFAPPLICATION NAME="myAPP" APPLICATIONTIMEOUT="#CREATETIMESPAN(0,0,60,0)#"  sessionTimeout=#CreateTimeSpan(0, 0, 20, 0)# sessionManagement="Yes"> 

检查会话变量是否设置:

<CFLOCK TIMEOUT="30" THROWONTIMEOUT="no" TYPE="Exclusive" Scope="session">
  <CFSET session.started = #ucase(dbGUID)#>
</CFLOCK>

现在页面每隔几秒钟会通过JQuery的load()方法从不同的后端页面加载数据到不同的DIV中。对于一些人来说,这一切都很好,没有任何问题,但是对于有些人来说,在几分钟到几个小时内它也许正常工作,然后突然Lucee将生成一个新的会话导致数据重新加载回主页,强制刷新主页以便您可以再次登录。然而,情况是这样的,页面刷新后,原始会话仍然存在,因此再次使用该会话,用户就能够再次查看页面数据。这对于某些人可能会发生很多次,而对于其他人则永远不会发生。

我相信这并非针对个人,因为在同一台PC上尝试是某些人没问题,而另外一些人却有问题。直接在Web服务器上(使用hosts文件将域名指向本地主机),没有遇到任何问题。它似乎不是负载均衡器的问题,因为它在负载均衡器上和不在负载均衡器上都会发生。 还要明确的是,它不是由特定的1个页面引起新会话的,它可以是任何正在使用的页面之一,并且它也不是由第一次尝试访问页面引起的,因为在生成新会话之前,它可能被访问数十次。它也不是超时,因为会话超时设置为20分钟,但是在原始会话被设置的一分钟内就可能发生。

问题是为什么Lucee突然决定创建一个新的会话(旧的仍然存在),我该如何阻止它或使其重新使用原始会话。


你的ajax请求是否在目标主机上有所不同?只要会话引用通过请求发送,它们就会在服务器端保持活动状态,并且只有在浏览器关闭(会话cookie过期)后才会在客户端超时。如果Lucee提供了一个新的会话,那么客户端没有在请求中发送现有的会话(或者已经过期)。当由于dbGUID不匹配而拒绝会话时,你是否记录日志?这种情况是否发生? - Alex
也许会话已过期或达到了空闲超时。当发生这种情况时,您是否看到任何服务器端警报或日志?此外,.load() 可能不使用相同的 cookie... 或者在服务器上显示为新套接字? - Twisty
当你说它也发生在负载均衡器之外时,你是如何测试的?你还提到使用具有本地IP的主机可以正常工作。如果你可以访问Web服务器日志,当问题发生时,你是否看到两个请求命中同一台服务器? - jfrobishow
1个回答

0
你确定一个新会话真的正在被创建吗?或者你是不是因为某个测试中没有存在 session.started来确定登录状态而假设的?
如果是这样的话,也许有一个不同的解释。或者至少有一种更好的方法可以知道一个新的会话是否像你所想象的那样意外地被创建了。
首先,请注意您正在使用具有throwontimeout=no属性的exclusive锁定方法。后者通常是反模式:如果在 timeout时间内无法获得锁定,则不会抛出错误,但是 cflock 中的代码将不会运行...因此 session.started 将不会设置。因此,任何测试其存在性的代码都会认为它不存在,这可能是您认为新会话正在被创建的原因之一。
如果您想确定在这些情况下是否确实创建了新会话,请输出 session.sessionid 变量(或在会话作用域转储中显示的任何其他 Lucee 生成变量),该变量可以唯一标识会话。当您感到意外地创建新会话时,该值是否发生了变化?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接