2016-05-03 109 views
4

は私がリクエストのアップロード中にクライアントの中断を処理するにはどうすればよいですか?

$ nc 192.168.56.1 8080 
POST /echo HTTP/1.1 
Host: 192.168.56.1:8080 
Content-Type: application/json 
Content-Length: 42 

^C 

はその後、サーバーが400で応答しようとしたヘッダを送信した後、接続を中止した場合Spring Initializrテンプレート

@SpringBootApplication 
public class DemoApplication { 
    public static void main(String[] args) { 
     SpringApplication.run(DemoApplication.class, args); 
    } 

    public static class Payload { 
     public String field1; 
     public String field2; 
    } 

    @RestController 
    public static class MyController { 
     @RequestMapping("/echo") 
     public ResponseEntity<Payload> echo(@RequestBody Payload payload) { 
      return new ResponseEntity<>(payload, HttpStatus.OK); 
     } 
    } 
} 

に基づいて、次のアプリケーションを考えると、次は

に記録されます
2016-05-03 16:56:28.916 WARN 5776 --- [nio-8080-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver : Failed to read HTTP message: org.springframework.http.converter.HttpMessageNotReadableException: Could not read document: Unexpected EOF read on the socket; nested exception is java.io.EOFException: Unexpected EOF read on the socket 
2016-05-03 16:56:28.997 ERROR 5776 --- [nio-8080-exec-2] o.a.c.c.C.[Tomcat].[localhost]   : Exception Processing ErrorPage[errorCode=0, location=/error] org.apache.catalina.connector.ClientAbortException: java.io.IOException: An established connection was aborted by the software in your host machine 

要求が送信された後でクライアントが異常終了した場合、デフォルトでは何も記録されず、結果として生じるClientAbortExceptionは、ErrorAttributes#getErrorを介してフィルタで利用可能である。

どのようにして要求中止を同じ方法で処理できますか?つまり、デフォルトでは警告/エラーが記録されず、クライアントが中止したことをカスタムフィルタが認識できるようになります。

答えて

1

私は解決策を見つけましたが、間違ったことを見つけていません。

@Autowired 
private DefaultErrorAttributes defaultExceptionResolver; 

@ExceptionHandler(HttpMessageNotReadableException.class) 
public void checkForAbort(HttpServletRequest request, HttpServletResponse response, RuntimeException exception) { 
    if (exception.getCause() instanceof EOFException) { 
     ClientAbortException abortException = new ClientAbortException(exception.getCause()); 
     abortException.addSuppressed(exception); 

     try { 
      response.getOutputStream().close(); 
     } 
     catch (IOException ex) { 
      abortException.addSuppressed(ex); 
     } 

     defaultExceptionResolver.resolveException(request, response, null, abortException); 
    } 
    else { 
     throw exception; 
    } 
} 

これは、たとえば、@ControllerAdviceになる可能性があります。

関連する問題