我的应用程序部署在共享的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()为时已晚。
当默认值超出界限时,有人能告诉我是否可以成功设置目录吗?
非常感谢, 尼尔
答案 0 :(得分:1)
这只是日志中的警告(不是错误),不用担心。接下来发生的事情是当你执行new Configuration()
时,它会尝试设置从当前目录加载的默认TemplateLoader
,在你的情况下恰好是{{1} }}。如果失败,则会记录此内容,然后使用C:\apache-tomcat\bin
作为null
。它并不重要,因为无论如何你自己设置TemplateLoader
,所以你覆盖它的默认值。
(顺便说一句,如果你使用TemplateLoader
,则使用2.3.21,则可以避免此警告,因为它不再使用new Configuration(new Version(2, 3, 21))
的那个愚蠢的默认值。)