我的C:\驱动器中的静态内容被jetty ResourceHandler别名

时间:2015-07-01 03:49:54

标签: jetty embedded-jetty jetty-8

我在我的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的修复程序,如果它还是个问题。

1 个答案:

答案 0 :(得分:1)

为您的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