我正在使用带有嵌入式Grizzly servlet容器(2.1.7)的Milton WebDAV服务器(1.6.8),并且在默认配置中,PUT请求(至少由Cyberduck发布)不起作用。我已经将问题跟踪到了如何处理HTTP 100 Continue(它显然也影响Jetty)的问题,Milton mailing list和bug tracker上的消息说它是servlet容器的错误,尝试用“透明的期望/继续处理”来聪明。
是的,透明处理的容器会继续有效地破坏Webdav的HTTP安全性。 HTTP使用挑战/响应安全模型,许多客户端依赖于此。即,如果执行PUT,他们将只执行未经身份验证的PUT并依赖ExpectContinue来确保在上载文件之前发出质询。
但是通过透明处理ExpectContinue,整个文件在milton API能够检查当前用户是否经过身份验证并被授权执行操作之前上传。
根据您支持的客户和您使用案例,这可能是完全不可接受的,令人讨厌或根本不是问题。
但是,一般来说,我认为你应该试着找出是否可以禁用Grizzly的透明处理,然后重新启用米尔顿的支持。
我可以做些什么来禁用Grizzly的透明期望/继续处理,这是非常正确的方法吗?另一种方法是关闭Milton中的期望/继续处理,但这似乎打破了WebDAV身份验证。
更新:我现在也尝试过Jetty(8.1.0.RC1),它表现出与Grizzly相同的行为:只有关闭了expect / continue处理,我可以使用默认PUT文件设置它不起作用。
答案 0 :(得分: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;
}
}
}
希望它会有所帮助。
答案 1 :(得分:0)
请注意,透明的期望 - 继续处理是否存在问题取决于您的目标客户端应用程序是否使用expect-continue身份验证。
我还没有详细研究过这个问题,所以我不能肯定地说哪些容器可以进行透明处理,是否可以禁用,或者客户端应用程序需要它。
如果来自Grizzly或Tomcat的人可以评论禁用容器处理的选项,那么可能会很好。