代码之家  ›  专栏  ›  技术社区  ›  Neil Richards

在共享tomcat托管环境中加载模板时出现AccessControlException

  •  0
  • Neil Richards  · 技术社区  · 11 年前

    我的应用程序部署在共享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的无参数构造函数,在您更改它之前,它可能会尝试从默认位置加载-使用setDirectoryForTemplateLoad()为时已晚。

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

    非常感谢, 尼尔

    1 回复  |  直到 11 年前
        1
  •  1
  •   ddekany    11 年前

    这只是日志中的警告(而不是错误),不用担心 new Configuration() ,它尝试设置默认值 TemplateLoader 当前目录 ,那是你的情况 C:\apache-tomcat\bin 。当它失败时,它会将其记录下来,然后使用 null 模板加载器 。没关系,因为你设置了 模板加载器 不管怎样,你自己,所以你覆盖了它的默认值。

    (BTW,如果您使用2.3.21 new Configuration(new Version(2, 3, 21)) 那么就避免了这个警告,因为它没有对 模板加载器 不再。)