我的 C:\ 驱动器中的静态内容被 jetty ResourceHandler 别名化了
Static content in my C:\ drive being aliased away by jetty ResourceHandler
我在我的 java 项目中使用了 emmedded jetty。出于某种原因,我发送到 resourceHandler 的路径是 c:\(小写),它被别名为 C:\(大写)。因此,我的静态内容没有被提供。
我读了一些文档,指出 Jetty 比较绝对路径和规范路径来检测别名。在日志中我看到:
[qtp15485575-19] INFO org.eclipse.jetty.server.handler.ResourceHandler - file:/c:/filepath 别名为 file:/C:/filepath
有人知道如何解决吗?
更新:为此记录了 eclipse 的错误:https://bugs.eclipse.org/bugs/show_bug.cgi?id=471526
这是他们的回复:
“这确实很烦人,但由于 servlet 规范的安全模型不佳而强加给我们。
如果规范说除非明确允许,否则所有 URI 都被拒绝,我们将不需要检查别名。但是它有一个模型,在该模型中它允许所有 URI,但明确拒绝的 URI 除外。
因此,如果对 /secretfile.txt 施加了安全约束,我们必须确保该文件的任何别名也受到约束……并以独立于 FS 的方式进行。这意味着在各种操作系统上我们可能需要阻止:
/sEcRetFile.TXT
/secretfile.txt
/SECRE~01.TXT
/secretfile.txt@@0
等等等等等
可以肯定的是,我们已经实现了别名系统。
通常我们不会遇到 c: 和 C: 的问题,因为在配置上下文时应该规范化,所以应该使用正确的。但是文件系统确实会在不同版本之间改变它们的行为,所以这可能非常烦人。
我认为这在 jetty 9.3 中处理得更好,我们可以使用 Path 类 来更好地检查部分路径。"
所以最好的办法可能是尽可能使用 Jetty 9,如果问题仍然存在,则使用 Joakin 的修复程序。
给你的 ResourceHandler
一个完整的、绝对的、真实的路径。
package jetty.resource;
import java.io.File;
import java.nio.file.Path;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.ResourceHandler;
import org.eclipse.jetty.util.resource.PathResource;
public class ResourceHandlerFromFSExample
{
public static void main(String[] args) throws Exception
{
Server server = new Server(8080);
Path webRootPath = new File("src/test/webroot").toPath().toRealPath();
System.err.println("WebRoot is " + webRootPath);
ResourceHandler handler = new ResourceHandler();
handler.setBaseResource(new PathResource(webRootPath));
handler.setDirectoriesListed(true);
server.setHandler(handler);
server.start();
server.join();
}
}
顺便说一句,DefaultServlet
is still a better choice for static file serving。
我在我的 java 项目中使用了 emmedded jetty。出于某种原因,我发送到 resourceHandler 的路径是 c:\(小写),它被别名为 C:\(大写)。因此,我的静态内容没有被提供。
我读了一些文档,指出 Jetty 比较绝对路径和规范路径来检测别名。在日志中我看到:
[qtp15485575-19] INFO org.eclipse.jetty.server.handler.ResourceHandler - file:/c:/filepath 别名为 file:/C:/filepath
有人知道如何解决吗?
更新:为此记录了 eclipse 的错误:https://bugs.eclipse.org/bugs/show_bug.cgi?id=471526
这是他们的回复: “这确实很烦人,但由于 servlet 规范的安全模型不佳而强加给我们。
如果规范说除非明确允许,否则所有 URI 都被拒绝,我们将不需要检查别名。但是它有一个模型,在该模型中它允许所有 URI,但明确拒绝的 URI 除外。
因此,如果对 /secretfile.txt 施加了安全约束,我们必须确保该文件的任何别名也受到约束……并以独立于 FS 的方式进行。这意味着在各种操作系统上我们可能需要阻止:
/sEcRetFile.TXT
/secretfile.txt
/SECRE~01.TXT
/secretfile.txt@@0
等等等等等
可以肯定的是,我们已经实现了别名系统。
通常我们不会遇到 c: 和 C: 的问题,因为在配置上下文时应该规范化,所以应该使用正确的。但是文件系统确实会在不同版本之间改变它们的行为,所以这可能非常烦人。
我认为这在 jetty 9.3 中处理得更好,我们可以使用 Path 类 来更好地检查部分路径。"
所以最好的办法可能是尽可能使用 Jetty 9,如果问题仍然存在,则使用 Joakin 的修复程序。
给你的 ResourceHandler
一个完整的、绝对的、真实的路径。
package jetty.resource;
import java.io.File;
import java.nio.file.Path;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.ResourceHandler;
import org.eclipse.jetty.util.resource.PathResource;
public class ResourceHandlerFromFSExample
{
public static void main(String[] args) throws Exception
{
Server server = new Server(8080);
Path webRootPath = new File("src/test/webroot").toPath().toRealPath();
System.err.println("WebRoot is " + webRootPath);
ResourceHandler handler = new ResourceHandler();
handler.setBaseResource(new PathResource(webRootPath));
handler.setDirectoriesListed(true);
server.setHandler(handler);
server.start();
server.join();
}
}
顺便说一句,DefaultServlet
is still a better choice for static file serving。