在servlet过滤器中,filterChain.doFilter(request,response);应该将请求传递给链中的下一个请求。
但请考虑以下两个代码:
代码1:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException
{
filterChain.doFilter(request, response);
try
{
Thread.sleep(20000);
}
catch(Exception e)
{
}
}
代码2:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException
{
try
{
Thread.sleep(20000);
}
catch(Exception e)
{
}
filterChain.doFilter(request, response);
}
两个过滤器都执行相同。即两者在提供请求之前需要20秒。
但实际应该发生的事情是Code1
应该立即服务,Code2
应该在20秒后服务。
为什么在Filter中存在这种歧义?
答案 0 :(得分:3)
在servlet或过滤器中休眠总是一个坏主意,因为HTTP工作线程是稀缺资源,因此你不应该阻止它们。但在你的特定例子中,有希望。
基本上,无论您在servlet中打印还是过滤到输出,都会隐式缓冲以提高性能。如果在servlet / filter中打印了足够的数据,servlet容器将刷新缓冲区,部分响应将到达客户端。但你也可以手动冲洗!
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
filterChain.doFilter(request, response);
response.flushBuffer();
Thread.sleep(20000);
}
flushBuffer()
指令强制容器刷新输出缓冲区。所有响应头和您从servlet发送的任何内容都将发送到客户端。但这里有一个问题:客户端将收到数据,但HTTP连接在接下来的20秒内保持打开状态。我用curl
测试了它,它按预期工作。但是当浏览器中使用相同的URL(在Opera,Firefox和Google Chrome上测试)时,浏览器会在显示任何内容之前等待20秒(这可能取决于您实际发送的内容)。