Mustache在NetBeans servlet中抛出“File not under root”异常

时间:2015-02-06 02:29:57

标签: java tomcat servlets netbeans mustache

编辑:我解决了我的问题。 (见下文。)

问题

我是NetBeans的新手,我遇到的问题涉及将资源加载到我的servlet应用程序,该应用程序使用Tomcat作为服务器通过NetBeans运行。一切都很好,直到我尝试使用Mustache模板库(在Java中)构建我的响应。此时,抛出异常:

com.github.mustachejava.MustacheException: File not under root: /opt/catalina/bin

在我尝试编译模板文件的代码中抛出此异常。我将资源(模板文件)的路径提供给compile的{​​{1}}方法。我的代码如下所示:

MustacheFactory

我的研究

我看了一下Mustache代码,尽我所知,这是正在发生的事情。 Mustache在加载资源时进行安全检查,尝试确保资源位于文件系统中应用程序的根目录下。因为NetBeans在Tomcat服务器上运行代码正在发挥某种神奇作用,而项目的代码实际上是在文件系统上的其他地方,所以Mustache认为有些可疑。

换句话说,它可以找到文件;它只是不喜欢它在哪里找到它。似乎Mustache将MustacheFactory mf = new DefaultMustacheFactory(); Mustache mustache = mf.compile(getFormTemplatePath()); 作为应用程序的根,而模板文件实际上位于更像/opt/catalina/bin的路径。

Mustache代码看起来像这样(只是为了检查我的推理):

~/NetBeansProjects/MyProject/WEB-INF/template_file.mst

我在以下网址找到了Mustache代码:

https://github.com/spullara/mustache.java/blob/00bd13145f30156cd39aaad7ab046b46b1315275/compiler/src/main/java/com/github/mustachejava/resolver/FileSystemResolver.java#L50

我的假设解决方案

我猜想在我选择和配置服务器时,必须有一些方法在NetBeans中配置应用程序,以协调此问题。我所尝试的是谷歌搜索try { // Check to make sure that the file is under the file root or current directory. // Without this check you might accidentally open a security whole when exposing // mustache templates to end users. File checkRoot = fileRoot == null ? new File("").getCanonicalFile() : fileRoot.getCanonicalFile(); File parent = file.getCanonicalFile(); while ((parent = parent.getParentFile()) != null) { if (parent.equals(checkRoot)) break; } if (parent == null) { throw new MustacheException("File not under root: " + checkRoot.getAbsolutePath()); } // [Try-catch block continues...] 的变体等等,并没有出现太多。我猜我甚至都不了解NetBeans,知道我应该搜索哪些关键词。甚至有可能我找到了解决方案,但是当我看到它时却无法识别它。

有人知道我会尝试什么吗?感谢。

2 个答案:

答案 0 :(得分:2)

放置模板文件的位置?

我自己解决了这个问题,尽管我通过模板文件做了更好的事情来解决它。最初,我将模板文件放在WEB-INF目录中,然后使用servlet上下文构建文件的路径。这似乎不是最佳做法。

再看一下Mustache源代码,我意识到Mustache首先尝试使用类加载器来获取文件。如果你让Mustache以首选的方式做到这一点,你就不需要提供完整的路径,只需提供文件的名称。但是类加载器只在某些地方查找,WEB-INF/lib目录是一个。 Web上的许多人建议将Mustache模板放在WEB-INF/lib目录中。

由于我是一个Maven项目,我将模板文件移动到src/main/resources目录。 (在NetBeans中,这是"其他来源"在“项目”窗格中。)在构建时,Maven会在其中包含任何内容并将其转储到WEB-INF/lib中。然后我只需要更改我的源代码以使用文件名,而不是文件的真实路径(就像我一直在做的那样)。一切正常。

因此,就我而言,我的问题源于将模板文件放入Mustache的一个尴尬位置。如果有人有更好的想法,或者其他任何需要补充的内容,我全都耳朵。

答案 1 :(得分:2)

您可以使用其他重载API

 Mustache compile(Reader reader, String name);

就像这样,您可以更喜欢将胡子模板文件放在任何地方

File f = new File(templateFilePath);
Mustache mustache = mf.compile(new InputStreamReader(new FileInputStream(f),Charset.forName("UTF-8")),f.getName());