1

我正在使用带有嵌入式 Grizzly servlet 容器 (2.1.7) 的 Milton WebDAV 服务器 (1.6.8),在其默认配置中,PUT 请求(至少由 Cyber​​duck 发出)不起作用。我已经将问题归结为如何处理 HTTP 100 Continue 的问题(它显然也会影响 Jetty),Milton 邮件列表错误跟踪器上的一条消息说这是 servlet 容器的错误,它试图巧妙地处理“透明的期望/继续处理”。

是的,透明处理期望的容器继续有效地破坏 Webdav 的 HTTP 安全性。HTTP 使用质询/响应安全模型,许多客户端都依赖它。即,如果执行 PUT,他们将简单地执行未经身份验证的 PUT,并依靠 ExpectContinue 确保在文件上传之前发出挑战。

但是通过对 ExpectContinue 的透明处理,整个文件在 milton API 能够检查当前用户是否经过身份验证并被授权执行操作之前被上传。

根据您支持的客户端和您的用例,这可能是完全不可接受的、令人讨厌的或根本不是问题。

但是,一般来说,我认为您应该尝试找出是否可以禁用 Grizzly 的透明处理,然后在 milton 中重新启用支持。

我能做些什么来禁用灰熊的透明期望/继续处理,这真的是正确的方法吗?另一种方法是在 Milton 中关闭期望/继续处理,但这似乎破坏了 WebDAV 身份验证。

更新:我现在也尝试了 Jetty(8.1.0.RC1),它表现出与 Grizzly 相同的行为:只有关闭期望/继续处理才能 PUT 文件,默认设置不起作用。

4

2 回答 2

1

关于 Grizly 2.x,您需要覆盖以下sendAcknowledgment方法ServletHandler

class MyServletHandler extends ServletHandler
{
    protected boolean sendAcknowledgment(final Request request,
        final Response response)
        throws IOException
    {
        if (authClient(request, response)
        {
            return super.sendAcknowledgment(request, response);
        }
        else
        {
            response.setStatus(HttpStatus.EXPECTATION_FAILED_417);
            return false;
        }
    }
}

希望它会有所帮助。

于 2011-12-13T09:52:09.783 回答
0

请注意,透明的期望继续处理是否存在问题取决于您的目标客户端应用程序是否使用期望继续身份验证。

我还没有对此进行过详细的研究,所以我不能肯定地说哪些容器进行透明处理以及是否可以禁用它,或者客户端应用程序需要它。

如果来自 Grizzly 或 Tomcat 的人可以评论禁用容器处理的选项可能会很好。

于 2011-12-08T01:52:56.170 回答