【问题标题】:Embedded Jetty not serving empty files嵌入式码头不提供空文件
【发布时间】:2015-03-18 05:09:07
【问题描述】:

设置:我已经设置了嵌入式码头(v9.1)以使用setDirectoriesListed(true) 提供静态文件,我使用的代码如下:

    // Create a basic Jetty server object that will listen on port 8080.  Note that if you set this to port 0
    // then a randomly available port will be assigned that you can either look in the logs for the port,
    // or programmatically obtain it for use in test cases.
    Server server = new Server(9090);

    // Create the ResourceHandler. It is the object that will actually handle the request for a given file. It is
    // a Jetty Handler object so it is suitable for chaining with other handlers as you will see in other examples.
    ResourceHandler resource_handler = new ResourceHandler();
    // Configure the ResourceHandler. Setting the resource base indicates where the files should be served out of.
    // In this example it is the current directory but it can be configured to anything that the jvm has access to.
    resource_handler.setDirectoriesListed(true);
    resource_handler.setWelcomeFiles(new String[]{ "index.html" });
    resource_handler.setResourceBase(".");

    // Add the ResourceHandler to the server.
    HandlerList handlers = new HandlerList();
    handlers.setHandlers(new Handler[] { resource_handler, new DefaultHandler() });
    server.setHandler(handlers);

    // Start things up! By using the server.join() the server thread will join with the current thread.
    // See "http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Thread.html#join()" for more details.
    server.start();
    server.join();

此代码最初来自here

当我导航到地址 http://localhost:9090/ 时,我会看到目录中列出的文件,并且可以单击并打开单个文本文件。

问题: 出于某种莫名其妙的原因,只有当我点击一个 0 字节的文件(又名它是一个空文件,但仍显示在浏览器中)时,连接才会尝试加载,但最终会多次出(30 秒),我在 safari 中收到回复说“服务器意外断开连接”。另外,当我对 0 字节文件创建 HttpURLConnection 时,我得到返回的内容长度为 -1;这当然只适用于空文件。

在独立 Jetty 中看到的预期行为:当我使用独立 Jetty 并提供相同的文件时,我能够“打开”在网络浏览器中仅返回空白页面的空文件。使用HttpURLConnection 时,我得到的内容长度为 0。

虽然这似乎是一项“毫无意义”的任务,但一台服务器正在以编程方式与嵌入式码头服务器同步(所以我希望这些空文件同步)。我想这与资源处理程序在提供静态内容时看到 0 字节有关,但我不太确定如何获得与现在独立码头服务器相同的行为,尝试拉动时出错空文件。

谢谢!

【问题讨论】:

    标签: jetty embedded-jetty


    【解决方案1】:

    您的代码至少在 Jetty 9.2.7.v20140116 上可以正常工作

    我使用的完整示例:

    package jetty;
    
    import java.io.File;
    
    import org.eclipse.jetty.server.Handler;
    import org.eclipse.jetty.server.Server;
    import org.eclipse.jetty.server.handler.DefaultHandler;
    import org.eclipse.jetty.server.handler.HandlerList;
    import org.eclipse.jetty.server.handler.ResourceHandler;
    
    public class SimpleResources
    {
        public static void main(String[] args)
        {
            Server server = new Server(9090);
    
            String resourceBase = System.getProperty("resourceBase", ".");
    
            System.err.printf("Resource Base is: %s%n", new File(resourceBase).getAbsolutePath());
    
            ResourceHandler resource_handler = new ResourceHandler();
            resource_handler.setDirectoriesListed(true);
            resource_handler.setWelcomeFiles(new String[] { "index.html" });
            resource_handler.setResourceBase(resourceBase);
    
            HandlerList handlers = new HandlerList();
            handlers.setHandlers(new Handler[] { resource_handler, new DefaultHandler() });
            server.setHandler(handlers);
    
            try
            {
                server.start();
                server.join();
            }
            catch (Throwable t)
            {
                t.printStackTrace(System.err);
            }
        }
    }
    

    我运行它,将-DresourceBase 系统属性指向具有以下内容的目录...

    $ ls -la
    total 8
    drwxrwxr-x. 2 joakim joakim 4096 Jan 20 11:53 .
    drwxrwxr-x. 3 joakim joakim 4096 Jan 20 11:53 ..
    -rw-rw-r--. 1 joakim joakim    0 Jan 20 11:53 foo.txt
    

    一旦运行控制台显示...

    2015-01-20 11:55:07.788:INFO::main: Logging initialized @68ms
    Resource Base is: /home/joakim/code/Jetty/empties
    2015-01-20 11:55:07.837:INFO:oejs.Server:main: jetty-9.2.7.v20150116
    2015-01-20 11:55:07.860:INFO:oejs.ServerConnector:main: Started ServerConnector@5461eda{HTTP/1.1}{0.0.0.0:9090}
    2015-01-20 11:55:07.861:INFO:oejs.Server:main: Started @144ms
    

    有了这样的测试请求......

    $ curl --dump-header - http://localhost:9090/foo.txt
    HTTP/1.1 200 OK
    Date: Tue, 20 Jan 2015 18:55:39 GMT
    Content-Type: text/plain
    Content-Length: 0
    Server: Jetty(9.2.7.v20150116)
    

    更新:

    在以下版本的 jetty 上也可以按原样工作(没有对版本进行详尽的测试,也只对一些旧版本进行了测试)

    • 9.2.6.v20141205 - 结果相同
    • 9.2.4.v20141103 - 结果相同
    • 9.2.1.v20140609 - 结果相同
    • 9.1.5.v20140505 - 响应标头中没有 Date,其余部分相同(是的,它也发送 Content-Length: 0

    【讨论】:

    • 啊,所以我没有意识到我有一个 9.0.4.v20130625.jar,它正在使用它,只是通过阅读你的输出来检查我的。我删除了旧的 jetty-all 库并用 jetty-all-9.3.0 替换它,现在它可以正常工作了。我猜我使用的 9.0.4 版本中存在一些错误...标记为已解决。
    猜你喜欢
    • 2016-06-21
    • 2012-07-18
    • 2015-04-06
    • 2012-05-04
    • 2013-12-29
    • 2013-12-30
    • 2015-03-21
    • 1970-01-01
    • 2014-02-25
    相关资源
    最近更新 更多