Sichere Verwendung von HttpURLConnection
Wenn mit HttpURLConnection nicht der InputStream geschlossen werden müssen, wenn wir nicht 'bekommen', und verwenden Sie es?
also ist dies sicher?
HttpURLConnection conn = (HttpURLConnection) uri.getURI().toURL().openConnection();
conn.connect();
//check for content type I don't care about
if (conn.getContentType.equals("image/gif") return;
//get stream and read from it
InputStream is = conn.getInputStream();
try {
//read from is
} finally {
is.close();
}
Zweitens, ist es sicher in der Nähe einen InputStream vor allem der Inhalt wurde vollständig Lesen?
Gibt es ein Risiko des Austritts aus der zugrunde liegenden socket-in ETABLIERTEN oder sogar CLOSE_WAIT Zustand?
InformationsquelleAutor der Frage Joel | 2011-01-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie Lesen alle Daten in den Eingabe-stream, bevor Sie es schließen, so dass die zugrunde liegende TCP-Verbindung wird zwischengespeichert. Ich habe gelesen, dass es nicht erforderlich sein sollte im neuesten Java -, aber es war immer das Mandat, Lesen Sie die ganze Antwort für die Verbindung erneut verwenden.
Check diesen Beitrag: keep-alive in java6
InformationsquelleAutor der Antwort Cratylus
Laut http://docs.oracle.com/javase/6/docs/technotes/guides/net/http-keepalive.html
und OpenJDK-Quellcode.
(Wenn keepAlive == true)
Wenn client namens HttpURLConnection.getInputSteam().in der Nähe(), die späteren Aufruf zu HttpURLConnection.trennen Sie () NICHT in der Nähe der Steckdose. d.h. Die Steckdose wird wiederverwendet (zwischengespeichert)
Wenn der Kunde keinen Aufruf von close(), Aufruf von disconnect() schließt die InputSteam und schließen Sie die Steckdose.
So um die Wiederverwendung der Buchse, rufen Sie einfach den InputStream schließen(). Rufen Sie nicht HttpURLConnection trennen().
InformationsquelleAutor der Antwort Anderson Mao
Hier finden Sie einige Informationen über den keep-alive cache. Alle diese Informationen betrifft Java 6, aber das ist wahrscheinlich auch genau für die vielen früheren und späteren Versionen.
Was ich sagen kann, der code reduziert sich auf:
Diese Logik ist split zwischen zwei Orten: in Zeile 725 von Sonne.net.www.http.HttpClient (in der "parseHTTPHeader" - Methode), und in Zeile 120 der Sonne.net.www.http.KeepAliveCache (die "put" Methode).
So, es gibt zwei Wege, um das timeout-Zeitraum:
Würde man denken, dass es möglich wäre, zu ändern der scheinbar willkürlichen fünf-Sekunden-Standard-ohne Neukompilierung internen JDK-Klassen, ist es aber nicht. Ein bug eingereicht wurde, im Jahr 2005 anfordern diese Fähigkeit, aber die Sonne weigerte sich zu stellen.
InformationsquelleAutor der Antwort Samuel Edwin Ward
Wenn Sie wirklich wollen, um sicherzustellen, dass die Verbindung schließen, sollten Sie rufen
conn.disconnect()
.Offenen verbindungen, die Sie beobachtet sind, weil der HTTP 1.1-Verbindung keep-alive " - Funktion (auch bekannt als Persistente HTTP-Verbindungen).
Wenn der server unterstützt HTTP 1.1 und senden eine
Connection: close
im response-header in Java nicht unmittelbar in der Nähe der darunterliegende TCP-Verbindung, wenn Sie schließen Sie die input-stream. Stattdessen hält Sie es öffnen und versucht Sie wieder zu verwenden für die nächste HTTP-Anfrage an den gleichen server.Wenn Sie nicht möchten, dass dieses Verhalten bei allen können Sie die system property
http.keepAlive
false:InformationsquelleAutor der Antwort Robert
Haben Sie auch zu schließen, Fehler stream, wenn die HTTP-Anforderung fehlgeschlagen ist (alles aber 200):
Wenn Sie es nicht tun, werden alle Anfragen, die nicht zurückkehren, 200 (z.B. timeout), wird ein Leck-Buchse. Sehen http://scotte.github.io/2015/01/httpurlconnection-socket-leak/ für mehr details.
InformationsquelleAutor der Antwort Vlad Lifliand
Ja, es muss immer geschlossen werden.
Nicht 100%, laufen Sie das Risiko, an einer NPE. Sicherer ist:
InformationsquelleAutor der Antwort Arjan Tijms