ColdFusion的可信缓存会影响哪些文件扩展名

nos*_*leg 6 coldfusion coldfusion-9 cfimport

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

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

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

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

Sea*_*eld 7

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

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

这对任何人来说都不应该是新闻.

显然,ACF和Railo将编译它们被要求处理的任何.cfm或.cfc文件,因此如果启用它们,它们将在可信缓存中"结束".

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

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

因此,cfinclude强制编译"any"文件,而受信任缓存的常规规则适用于加载到内存中的类.

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


Sha*_*mes 5

默认情况下,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>
Run Code Online (Sandbox Code Playgroud)

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

注意:您还需要为Web服务器进行一些额外配置,无论是Apache,IIS还是其他任何配置.

一旦CF配置为处理特定扩展名的文件,它就会被添加到在可信任缓存中处理的文件列表中 - 因为该文件最终等同于引擎盖下的已编译.class文件.


nos*_*leg 0

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

您的前两个要点分别由肖恩·霍姆斯的回答肖恩·科菲尔德的回答涵盖。

第三点:cfmodule 仅限于 cfm 文件,因此扩展名是您唯一需要担心的。

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