0

我在我的 java 项目中使用 emmedded jetty。出于某种原因,我发送到 resourceHandler 的路径是 c:\(小写),它被别名为 C:\(大写)。因此,我的静态内容没有被提供。

我阅读了一些文档,表明码头比较绝对路径和规范路径来检测别名。在日志中我看到:

[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 的修复程序。

4

1 回答 1

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仍然是静态文件服务的更好选择

于 2015-07-01T14:08:22.560 回答