2012-08-17 3 views
1

서블릿 필터에서 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 초 후에 처리되어야합니다. 왜 필터에서이 모호성이 있습니까?

답변

3

HTTP 작업자 스레드가 부족한 자원이므로 서블릿이나 필터에서 잠자기하는 것은 항상 나쁜 생각이므로 차단해서는 안됩니다. 그러나 당신의 특별한 예에서 희망이 있습니다.

기본적으로 서블릿 또는 필터에서 인쇄물로 인쇄 한 내용은 성능을 향상시키기 위해 암시 적으로 버퍼링됩니다. 서블릿/필터 내에 충분한 데이터를 인쇄하면 서블릿 컨테이너가 버퍼를 비우고 응답 부분이 클라이언트에 도달합니다. 그러나 수동으로 플러시 할 수도 있습니다!

public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { 
    filterChain.doFilter(request, response); 
    response.flushBuffer(); 
    Thread.sleep(20000); 
} 

flushBuffer() 명령은 컨테이너로 하여금 출력 버퍼를 플러시하도록합니다. 모든 응답 헤더와 서블릿에서 보낸 내용은 모두 클라이언트로 전송됩니다. 그러나 여기에 잡기가 있습니다. 클라이언트는 데이터를 받지만 HTTP 연결은 다음 20 초 동안 열린 채로 있습니다. 나는 이것을 curl으로 테스트했으며 예상대로 작동합니다. 그러나 브라우저에서 동일한 URL (Opera, Firefox 및 Chrome에서 테스트)을 사용하면 브라우저는 아무 것도 표시하기 전에 20 초 동안 기다립니다 (실제로 보낸 내용에 따라 다를 수 있음).

+0

응답과 연결된 출력 스트림 (또는 작성자)을 명시 적으로 닫음으로써 클라이언트를 릴리스 할 수는 있지만이를 보장 할 수는 없습니다. –

관련 문제