如何让HTTP 100在嵌入式Grizzly上继续为WebDAV工作?
我正在使用Milton WebDAV服务器(1.6.8)和嵌入式Grizzly servlet容器(2.1.7),在它们的默认配置中,PUT请求(至少由Cyberduck发出)不起作用。我已经追踪到了HTTP 100 Continue如何处理的问题(它显然也会影响Jetty),一条关于的消息说这是servlet容器的错误,它试图巧妙地使用“透明的expect/Continue处理” 是的,透明处理的容器将继续有效地破坏Webdav的HTTP安全性。HTTP使用质询/响应安全模型,许多客户端依赖于此。即,如果执行PUT,他们只需执行未经验证的PUT,并依靠ExpectContinue确保在上传文件之前发出质询 但是通过对ExpectContinue的透明处理,在milton API能够检查当前用户是否经过身份验证和授权执行操作之前,整个文件都会被上传 根据您支持的客户机和您的用例,这可能是完全不可接受的、令人讨厌的或根本不是问题 但是,总的来说,我认为你应该试着找出Grizzly的透明处理是否可以被禁用,然后在milton中重新启用支持 如何禁用Grizzly的透明expect/continue处理,这真的是正确的方法吗?另一种选择是在Milton中关闭expect/continue处理,但这似乎破坏了WebDAV身份验证如何让HTTP 100在嵌入式Grizzly上继续为WebDAV工作?,http,servlets,webdav,grizzly,milton,Http,Servlets,Webdav,Grizzly,Milton,我正在使用Milton WebDAV服务器(1.6.8)和嵌入式Grizzly servlet容器(2.1.7),在它们的默认配置中,PUT请求(至少由Cyberduck发出)不起作用。我已经追踪到了HTTP 100 Continue如何处理的问题(它显然也会影响Jetty),一条关于的消息说这是servlet容器的错误,它试图巧妙地使用“透明的expect/Continue处理” 是的,透明处理的容器将继续有效地破坏Webdav的HTTP安全性。HTTP使用质询/响应安全模型,许多客户端依赖于
更新:我现在也尝试了Jetty(8.1.0.RC1),它表现出与Grizzly相同的行为:只有关闭expect/continue处理,我才能放入文件,使用默认设置时,它不起作用。请注意,透明的expect continue处理是否存在问题取决于目标客户端应用程序是否使用expect continue身份验证 我还没有对此进行过太多的详细研究,所以我无法确定哪些容器进行透明处理,是否可以禁用,或者客户端应用程序需要它
如果来自Grizzly或Tomcat的人可以对禁用容器处理的选项发表评论,这可能会很好。请注意,透明的expect continue处理是否存在问题取决于目标客户端应用程序是否使用expect continue身份验证 我还没有对此进行过太多的详细研究,所以我无法确定哪些容器进行透明处理,是否可以禁用,或者客户端应用程序需要它
如果Grizzly或Tomcat的人可以对禁用容器处理的选项发表评论,这可能会很好。关于Grizly 2.x,您需要在
ServletHandler
中重写sendAcknowledgement
方法,如下所示:
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;
}
}
}
希望它能有所帮助。关于Grizly 2.x,您需要在
ServletHandler
中重写sendAcknowledgement
方法,如下所示:
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;
}
}
}
希望能有所帮助。尝试过,但没有成功。也放了一个断点,但没有放进去。谁应该呼叫
sendAcknowledge
以及何时?从我看到的情况来看,Milton只是将状态代码设置为SC_CONTINUE并完成请求处理。明天将深入挖掘,但目前看来,sendAcknowledge
不是在我的ServletHandler上调用的,而是在HttpHandlerChain.pls上调用的。尝试最新的Grizzly 2.1.8,现在它确实会被调用。我发誓昨天没有2.1.8;-)。但是什么是authClient
?我们刚刚发布了2.1.8:)authClient()什么都不是,只是您可以在那里实现的“任何”逻辑的一个示例。尝试过,但没有成功。也放了一个断点,但没有放进去。谁应该呼叫sendAcknowledge
以及何时?从我看到的情况来看,Milton只是将状态代码设置为SC_CONTINUE并完成请求处理。明天将深入挖掘,但目前看来,sendAcknowledge
不是在我的ServletHandler上调用的,而是在HttpHandlerChain.pls上调用的。尝试最新的Grizzly 2.1.8,现在它确实会被调用。我发誓昨天没有2.1.8;-)。但是什么是authClient
?我们刚刚发布了2.1.8:)authClient()什么都不是,只是一个可以在那里实现的“任何”逻辑的示例。对于Milton来说,有一个“引用容器”可以让expect continue开箱即用吗?如果我不能使它工作,我就不必使用Grizzly。对于Milton来说,有没有一个“参考容器”可以让expect continue开箱即用?我不必使用灰熊,如果我不能使它工作。