Als ich eine Webanwendung debuggte, die mit Ajax auf den Server zugreift, war die Antwort aus irgendeinem Grund seltsam. Weder der Antworttext noch der HTTP-Header werden zurückgegeben. Ich habe die Ursache untersucht und sie zusammengefasst.
Test.java
@RestController
public class TestController {
@RequestMapping(value = "/test.do", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public String test(HttpServletRequest request) throws Exception {
return "{ \"success\" : true }";
}
}
ajax.js
var req = new XMLHttpRequest();
req.open("POST", "test.do");
req.send();
Als ich tiefer und tiefer in die Schrittausführung ging, wurde in `` `NioChannel.class``` in tomcat-coyote.jar eine Ausnahme ausgelöst.
NioChannel.class
/**
* This method should be used to check the interrupt status before
* attempting a write.
*
* If a thread has been interrupted and the interrupt has not been cleared
* then an attempt to write to the socket will fail. When this happens the
* socket is removed from the poller without the socket being selected. This
* results in a connection limit leak for NIO as the endpoint expects the
* socket to be selected even in error conditions.
*/
protected void checkInterruptStatus() throws IOException {
if (Thread.interrupted()) {
throw new IOException(sm.getString("channel.nio.interrupted"));
}
}
Diese Ausnahme wurde in der oberen Ebene abgefangen und als Antwort auf den Fehler neu geschrieben.
Ich habe jedes Mal eine Stapelverfolgung dieser Ausnahme auf der Konsole erhalten, aber ich habe sie ignoriert, weil sie 200 zurückgegeben hat. Wenn es wie ein Fehler aussieht, können Sie es nicht ignorieren. Aber ich denke, es ist eine schreckliche Falle.
Recommended Posts