【问题标题】:Storing Coldfusion CFC instance in REQUEST scope, is it safe?在 REQUEST 范围内存储 Coldfusion CFC 实例是否安全?
【发布时间】:2012-04-18 13:49:00
【问题描述】:

将 CFC 对象存储在 REQUEST 范围内以供以后访问是否安全?目前,我们的网站至少会加载两次导航数据,如果他们使用我们的面包屑功能,可能会加载三次。有时,这些数据可能会有所不同,但在大多数情况下,最终会进行三个单独的调用以获取相同的确切导航数据...

所以,我想在第一次加载之后,将 REQUEST 范围内的导航数据保存在某种结构中,然后在随后的调用中,检查该数据是否已经存在,如果是,就使用什么被存储而不是重新创建它。我知道这将访问包含对象之外的共享范围,这可能不是一个好习惯,但最终可以减少一半的页面加载时间......

我知道这是可以做到的,但是,我们最近遇到了服务器问题,其中一些可能是我们使用/存储某些东西的方式导致内存泄漏,所以想知道这样做是否安全......

【问题讨论】:

  • 不清楚您是否希望跨多个页面加载维护信息,但是如果它是每个用户,我会查看这种缓存的会话范围,或者如果它是每个用户,我会查看应用程序应用。阅读此答案:stackoverflow.com/questions/25672/…
  • 存储在会话中,或者其他持久化范围对我们不起作用;我已经试过了。我只考虑 REQUEST,因为我假设它在请求结束后被完全“丢弃”,但即使每个请求“缓存”这些数据也可能至少节省 1/2 的页面加载时间,因为我们不必这样做每个请求多次加载相同的数据。
  • 好吧,如果它只是针对单个请求,那么调用模板中的变量范围怎么样?以前用过类似的。这个变量需要在函数中访问吗?
  • 是的,它需要在函数和 CFC 中可访问(我知道,这不是好的做法,但现在我更担心性能,因为这是最近的一个问题)。

标签: coldfusion coldfusion-8 cfc


【解决方案1】:

variablesrequest 范围都适合您的目的,但更可取的是修改需要访问此变量的函数以接受您的缓存变量作为参数。对于 CFC,它可以在 init() 方法中传递并存储以供该 CFC 中的方法使用(假设您对其进行了初始化)

通过依赖一个全局变量(即使是一个仅限于当前请求的变量),您可能只会给自己带来麻烦,这可以通过确保方法更加封装来解决。

正如我之前在 cmets 中提到的,ColdFusion - When to use the "request" scope? 值得快速阅读,因为它的答案中有相关信息。

【讨论】:

  • 是的,我知道这不是一个好的做法,但是按照目前的结构,我认为修改这些 CFC 方法的签名不是一个好主意......我们的意图主要是放弃我们当前的代码库并从头开始,在编写和使用代码之前会考虑这些设计考虑。不过现在,我们正在研究可以做的一些小调整,以便在我们开发这款新产品之前保持我们的状态。
  • 那么如前所述,variablesrequest 将是合适且足够安全的。如果您想确保它们被销毁,只需在脚本末尾执行StructDelete(request,'yourVariableName');
【解决方案2】:

是的。唯一可以访问 REQUEST 范围的请求是当前请求。

【讨论】:

    猜你喜欢
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    • 2017-08-05
    • 2017-06-12
    相关资源
    最近更新 更多