Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsp Servlet过滤器的行为含糊不清?_Jsp_Tomcat_Servlets_Webserver_Servlet Filters - Fatal编程技术网

Jsp Servlet过滤器的行为含糊不清?

Jsp Servlet过滤器的行为含糊不清?,jsp,tomcat,servlets,webserver,servlet-filters,Jsp,Tomcat,Servlets,Webserver,Servlet Filters,在servlet过滤器中,filterChain.doFilter(请求、响应);应该将请求传递给链中的下一个。 但是请考虑下面两个代码: 代码1: public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { filterChain.doFilter(request, response)

在servlet过滤器中,filterChain.doFilter(请求、响应);应该将请求传递给链中的下一个。 但是请考虑下面两个代码:
代码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);      
}
两个过滤器的执行方式相同。i、 e.两者都需要20秒才能送达请求。
但实际上应该发生的是
Code1
应该立即发球,而
Code2
应该在20秒后发球。
为什么过滤器中存在这种模糊性?

睡在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秒才显示任何内容(这可能取决于您实际发送的内容)。

您可以通过显式关闭与响应关联的输出流(或写入器)来释放客户端,但我不相信这是可以保证的。