【问题标题】:Which file extensions are affected by ColdFusion's Trusted CacheColdFusion 的可信缓存会影响哪些文件扩展名
【发布时间】:2011-11-25 13:02:03
【问题描述】:

Trusted Cache 会缓存哪些文件扩展名? CFM 和 CFC 是显而易见的,但 CFR 呢?受信任的缓存是否捕获了其他文件扩展名?

我知道/怀疑文件进入模板缓存的一些地方是:

  • 直接在url中指定(cfmcfmlcfc,更多?)
  • cfinclude(cfinclude 中使用的任何文件扩展名,例如<cfinclude template="./some.css">
  • cfmodule(cfm,更多?)
  • cfimport (cfm, 还有jartld?)
  • cfobject、createobject(cfc,还有 .net、com、java 和 Web 服务?)
  • cfreport(cfr哪个可以用cfcompile实用程序编译?)

是否有其他标签具有将内容添加到模板缓存中的相同效果?

【问题讨论】:

    标签: coldfusion coldfusion-9 cfimport


    【解决方案1】:

    Adobe ColdFusion(和 Railo)将 CFML 模板编译为 JVM 字节码,如果配置为这样做,会将编译后的类作为 .class 文件写入磁盘。模板缓存是一种机制:如果目标类已经加载,不要费心查看磁盘上的(源)文件是否需要重新编译 - 相信内存中的内容。

    最近对 ACF 和 Railo 的增强允许您指定(源)文件可以始终检查(不受信任)、每次请求检查一次、从不(始终受信任)。

    这对任何人都不应该是新闻。

    很明显,ACF 和 Railo 将编译任何他们被要求处理的 .cfm 或 .cfc 文件,因此如果启用,这些文件将“最终”在受信任的缓存中。

    如果您 cfinclude 一个文件 - 任何文件 - ACF 和 Railo 也会将其编译为 JVM 字节码(如果配置为在磁盘上创建一个 .class 文件)。由于编译了包含的文件,因此它也将“结束”在受信任的缓存中。如果你包含一个 CSS 文件会发生什么?它被编译为字节码,将 CSS 文件的全部内容作为字符串输出到响应流。由于它是一个已编译的类,现在输出一个硬编码的字符串,如果您更改 CSS 源文件并启用了受信任的缓存,ACF 和 Railo 将信任类加载器中的内容而不重新编译它(假设“从不”检查源是管理员设置)。

    您可以通过清除 cfclasses 文件夹、重新启动 CFML 引擎并运行代码来验证这一点。您将看到 CSS 文件的 .class 文件(假设您已启用将类文件保存到磁盘)。

    因此,cfinclude 强制编译“任何”文件,并且可信缓存的正常规则适用于加载到内存中的类。

    我不再使用 ACF,因此我无法详细说明 .cfr 文件(Railo 不支持报告文件),但这很可能取决于 ACF 是否编译 .cfr 文件。它应该很容易验证(通过查看 cfclasses 文件夹)。

    【讨论】:

    • 谢谢! +1 为缺少的链接,我已经删除了我的答案。
    • 这一切都是有意义的,并且与网络上其他地方的数据相关,我找不到关于什么可以进入模板缓存以及如何进入的详细信息。我知道/怀疑模板输入的其他一些领域是:根据@ShawnHolmes 原始答案从网络服务器直接加载、cfinclude、cfmodule、cfimport(jars 和tlds 以及cfms?)、cfobject (cfcs,但 .net、com、java 和 Web 服务?)、createobject、cfreport(cfr 可以使用 cfcompile 实用程序),其他?另外,我认为 ACF 并不总是编写 .class 文件。跑了测试,只有一个 .class 而不是 4 个。
    • @ShawnHolmes 很遗憾您删除了答案的原始部分,我认为这是该问题答案中非常有价值的部分。
    • 我不想用我的正确答案混淆,但我会将其返回以供查看/参考,没有拙劣的部分。
    【解决方案2】:

    默认情况下,ColdFusion 附带在 JRun 中映射的 *.cfm、*.cfc 和 *.cfml 扩展作为受信任的扩展。您可以通过在 \JRun4\servers\cfusion\cfusion-ear\cfusion-war\WEB-INF\ 中打开 j2ee-web.xml 和 web.xml 配置文件来查看这些映射(或附近,根据您的安装) :

    <servlet-mapping id="coldfusion_mapping_3">
        <servlet-name>CfmServlet</servlet-name>
        <url-pattern>*.cfm</url-pattern>
    </servlet-mapping>
    <servlet-mapping id="coldfusion_mapping_4">
        <servlet-name>CFCServlet</servlet-name>
        <url-pattern>*.cfc</url-pattern>
    </servlet-mapping>
    <servlet-mapping id="coldfusion_mapping_5">
        <servlet-name>CfmServlet</servlet-name>
        <url-pattern>*.cfml</url-pattern>
    </servlet-mapping>
    

    但是,您也可以在此处手动配置全新的映射,这将允许 ColdFusion 解析/编译具有不同扩展名的文件中的 CFML 标签(我曾使用已配置为解析的 CF 服务器.shtml,例如)

    注意:您还必须为您的 Web 服务器进行一些额外的配置,无论是 Apache、IIS 还是其他。

    一旦 CF 被配置为处理具有特定扩展名的文件,它就会被添加到受信任的缓存中处理的文件列表中——因为该文件最终等同于在后台编译的 .class 文件。

    【讨论】:

    • 我添加了另一种情况,我发现内容可以进入模板缓存。你有进一步的见解吗?
    • 您提供的链接是一个应用程序级对象被缓存的示例,同时继续动态执行其方法/伪构造函数的主体,而后者又是一个 CFINCLUDE。这类似于我上面的Situation B。对象和方法被缓存,但方法调用时产生的结果不是。这与受信任的缓存无关,这是一个完全独立的过程 CF 用于检查/忽略 CF 模板以进行修改/重新编译。
    • 我们的语言仍然不同。我将重新考虑如何处理这个问题,并很快更新我的原始答案。
    • 原始答案仍然成立:只有具有上述映射的页面才会添加到受信任的缓存中。您从中删除的脚注是:如果这些映射中的任何一个调用 cfinclude 并指向一个不在这些映射中的文件(即 CSS、TXT 等),则该文件是上下文包含的(而不是评估),因此也成为了可信缓存的一部分。请确保您清楚最后一部分:some.css 并未物理放置在受信任的缓存中;它的 contents 是,因为它被包含在 CF 模板中。
    • 我再次更新了问题,以删除较少的问题,例如方面。您的评论答案现在直接回答第一个项目符号上的 more。干杯。
    【解决方案3】:

    很遗憾,此信息没有官方来源。但是,可以通过大量工作来测试每个标签,以查看文件是否最终在受信任的缓存中。

    Shawn Holmes' answerSean Corfield's answer 分别涵盖了您的前两个要点。

    Bullet 3:cfmodule 仅限于 cfm 文件,因此扩展是您唯一需要担心的。

    要点 6:cfreport 不应进入模板缓存,因为它正在转换文件,而不是编译它以供代码执行。

    【讨论】:

      猜你喜欢
      • 2012-12-31
      • 2018-06-22
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多