2.3.17

Page Contents

发布日期:2011-05-17

由于security fix,可能迫切需要更新到此版本!

FTL 方面的更改

  • ?seq_index_of?seq_last_index_of现在也适用于集合(freemarker.template.TemplateCollectionModel -s),不仅适用于序列(freemarker.template.TemplateSequenceModel -s)。

  • ?long现在可用于日期,日期时间或时间值,并返回自纪元以来的毫秒数(如java.util.Date.getTime())。

  • 为了将数字(通常是 Java long -s)转换为日期或日期时间和时间值,添加了?number_to_date?number_to_time?number_to_datetime在这里查看更多...(很遗憾,由于向后兼容性问题,无法扩展?date等功能来支持此功能.)

  • 新的内置函数可以使用 ISO 8601“扩展”格式来格式化数字,而与当前日期/时间格式设置无关,甚至与当前时区设置无关。例如${myTimeStamp?iso_utc}将打印类似2010-05-16T23:05:45Z的内容。 在这里查看更多...

  • 新的special variablenow。这将返回当前日期时间。用法示例:“ Page generated: ${.now}”,“ Today is ${.now?date}”,“ The current time is ${.now?time}”。

  • ?sort?sort_by现在支持对布尔值进行排序。

  • 当使用不受支持或未知的字符串内置标志时,FreeMarker 现在将log警告(每个类加载器最多 25 次,以防止日志泛滥)。可以肯定的是,从 FreeMarker 2.4 开始,这些将被视为错误。

  • 已修复[3047201]的错误:使用正则表达式(如?match)可能会在多线程环境中导致锁定,并且在使用动态生成的正则表达式时也会导致内存泄漏。

  • 已修复的错误:?seq_contains?seq_index_of?seq_last_index_of失败,其中非java.util.List java.util.Collection -s 用纯BeansWrapper(不是DefaultObjectWrapper)包装为TemplateSequenceModel。 (另请参见:下面的getSupportsIndexedAccess())

Java 方面的更改

  • 安全修复:使用精心设计的模板名称(模板路径)包含代码点 0('\u0000'),可以从模板根目录外部加载文件,就像它们是 FreeMarker 模板一样。问题的根源在于底层的本机 C/C 部分(属于 Java 平台或 OS)将 0 解释为字符串的结尾,而 Java(以及 FreeMarker 和 Servlet 容器)则不解释为 0 。因此,对于 FreeMarker 而言看起来安全的路径在较低级别上变得不安全。所有通过名称(Configuration.getTemplate(...)<#include ...><#import ...>)加载模板的方式都存在问题。

如果您不允许用户上载模板,并且也至少允许以下其中一个摊位,则不会受到影响:

  • 在您的系统中,用户不能提供任意字符串作为模板名称(模板路径)。例如,如果仅允许用户访问属于 MVC 控制器的 URL(例如他们无法访问*.ftl),那么他们将无法建议任意模板名称。

    • 模板名称是网页 URL 中路径的一部分,并且您的 Web 服务器或 Servlet 容器不允许包含%00的 URL,或者在将 URL 传递给 Servlet 之前终止该 URL。

    • 您使用的是FileTemplateLoader,并且其中不允许链接(默认情况下,不允许链接)。

  • FreeMarker 现在可以使用 SLF4J 或 Apache Commons Logging 直接记录其消息。但是,直到 2.4 版本,它才会自动使用这些 Logger 库; 在这里看到更多...但建议立即切换到 SLF4J。

  • 新设置:"auto_flush"Configurable.setAutoFlush(boolean)。设置是否在Template.process(Object, Writer)的结尾(及其重载)自动刷新输出Writer。默认值为true,它对应于较早的行为。例如,当网页由几个未由#include(或类似指令)插入到 FreeMarker 主模板中的框(如 portlet,GUI 面板等)组成时,就需要使用false。一个单独的Template.process(...)调用。在这种情况下,自动刷新将在每个框之后提交 HTTP 响应,因此会干扰全页缓冲,并且如果响应缓冲区刷新太频繁和太早,也可能会降低性能。

  • 添加了新设置:Configuration.setNewBuiltinClassResolver(TemplateClassResolver)new_builtin_class_resolver属性。这使您可以指定new built-in(如"com.example.SomeClass"?new())如何解析类以及根本可以访问哪些类。如果您允许不太受信任的用户上载模板,则您绝对应该感兴趣;请参阅freemarker.core.Configurable.setSettingfreemareker.template.Configuration.setNewBuiltinClassResolver的 Java API 文档。否则,仍建议将其设置为TemplateClassResolver.SAFER_RESOLVER(如果使用属性,则设置为safer),尽管不是 100%向后兼容(请参阅 Java API 文档)。

  • 添加了freemarker.cache.NullCacheStorage:将其设置为Configuration中的缓存存储将禁用缓存。

  • 已将getSupportsIndexedAccess()添加到freemarker.ext.beans.CollectionModel,因此可以检查TemplateSequenceModel.get(int)是否适用于特定的CollectionModel实例。

  • 已修复错误[2992265]:JSP FreeMarkerPageContext.include行为不正确。

  • 错误修正:将 FreeMarker 的 JSP 支持与使用javax.servlet.jsp.PageContext.pushBody的 JSP 标签(例如某些 Stripes 标签)一起使用时,_出现在freemarker.ext.jsp.FreeMarkerPageContext.popWriter内部。

  • 已修复错误[3033015]AllHttpScopesHashModel使用WrappingTemplateModel.getDefaultObjectWrapper()在页面范围内包装变量,而将用户指定的ObjectWrapper用于所有其他范围(请求,会话等)。现在,它也在页面范围内使用用户指定的包装器。

  • 已解决错误[3128073]HashAdapther.containsKey(...)返回true,因为解开密钥失败时该密钥不存在。作为此修复程序的副作用,BeansWrapper.CAN_NOT_UNWRAP现在是私有的;早些时候,它是错误的公开。

  • 大固定的[3151085]freemarker.jsp.TaglibFactory无法正确找到 tld 文件。此修复程序使 JSP 规范可以更好地符合解析和加载 tld 文件的要求。

  • 修正了错误:使用具有自定义 null 模型的BeansWrapper解开null不会导致null。现在,解包null和自定义 null 模型都提供null

  • 日志消息不再包含换行符(CR 或 LF),并使用 Java 字符串 Literals 语法引用路径和其他任意文本,这些语法也将<个字符转义为\u003C。这些解决了与质量差的日志附加器和错误的日志读取器有关的安全问题。此更改在模板处理错误条目上最为明显,现在将引用异常消息。请注意,如何记录堆栈跟踪(Throwable对象)仍然取决于您使用的日志记录框架。

Other changes

  • freemarker/ext/jsp中的freemarker.jar中包含的 DTD 和 XSD 现在受 Apache 软件许可版本 2 的约束。LICENSE.txt中也对此进行了说明。早期,这些文件没有明确的许可条款。