共享tomcat托管环境中模板加载的AccessControlException

时间:2013-09-19 12:35:15

标签: spring freemarker

我的应用程序部署在共享的Tomcat托管环境中,其中我的appBase位于容器之外,并且严格保持安全策略。我现在正在尝试介绍Freemarker模板,但我得到了这个:

Could not create a file template loader for current directory
java.security.AccessControlException: access denied (java.io.FilePermission C:\apache-tomcat\bin read)
        at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)
        at java.security.AccessController.checkPermission(AccessController.java:546)
        at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
        at java.lang.SecurityManager.checkRead(SecurityManager.java:871)
        at java.io.File.exists(File.java:731)
        at freemarker.cache.FileTemplateLoader$1.run(FileTemplateLoader.java:124)
        at java.security.AccessController.doPrivileged(Native Method)
        at freemarker.cache.FileTemplateLoader.<init>(FileTemplateLoader.java:122)
        at freemarker.cache.FileTemplateLoader.<init>(FileTemplateLoader.java:108)
        at freemarker.cache.FileTemplateLoader.<init>(FileTemplateLoader.java:94)
        at freemarker.cache.TemplateCache.createDefaultTemplateLoader(TemplateCache.java:120)
        at freemarker.cache.TemplateCache.<init>(TemplateCache.java:115)
        at freemarker.template.Configuration.<init>(Configuration.java:110)
        at freemarker.template.Configuration.<clinit>(Configuration.java:96)
        at org.springframework.ui.freemarker.FreeMarkerConfigurationFactory.newConfiguration(FreeMarkerConfigurationFactory.java:333)
        at org.springframework.ui.freemarker.FreeMarkerConfigurationFactory.createConfiguration(FreeMarkerConfigurationFactory.java:266)
        at org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean.afterPropertiesSet(FreeMarkerConfigurationFactoryBean.java:6
0)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$6.run(AbstractAutowireCapableBeanFactory.java:1504)

即使我相信已经遵循Freemarker的安全政策建议。

使用Spring注入配置:

<bean id="freemarkerMailConfiguration"
        class="org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean">

    <property name="templateLoaderPath" value="file:/C:/apache-tomcat-files/mailtemplates/"/>
</bean>

或手动创建

    Configuration freemarkerMailConfiguration = new Configuration();
    File dir = new File("C:/apache-tomcat-files/mailtemplates");
    freemarkerMailConfiguration.setDirectoryForTemplateLoading(dir);

异常似乎源于Configuration的no-args构造函数,可能它会尝试从默认位置加载,然后才能更改它 - 使用setDirectoryForTemplateLoading()为时已晚。

当默认值超出界限时,有人能告诉我是否可以成功设置目录吗?

非常感谢, 尼尔

1 个答案:

答案 0 :(得分:1)

这只是日志中的警告(不是错误),不用担心。接下来发生的事情是当你执行new Configuration()时,它会尝试设置从当前目录加载的默认TemplateLoader,在你的情况下恰好是{{1} }}。如果失败,则会记录此内容,然后使用C:\apache-tomcat\bin作为null。它并不重要,因为无论如何你自己设置TemplateLoader,所以你覆盖它的默认值。

(顺便说一句,如果你使用TemplateLoader,则使用2.3.21,则可以避免此警告,因为它不再使用new Configuration(new Version(2, 3, 21))的那个愚蠢的默认值。)