[英]404 when accessing Tomcat with HttpUrlConnection, 200 from browser
我收到了最奇怪的 Tomcat 錯誤。 我有一個 Web 應用程序在我的本地主機上使用 tomcat 運行在端口 8080 上,一切似乎都運行良好,沒有錯誤等。但是,當我嘗試使用 HttpURLConnection 類從另一個應用程序訪問此 Web 應用程序時,出現 404 錯誤。 奇怪的是,當我在瀏覽器中放置相同的 URL 時,它返回一個 200 代碼並有一個有效的響應。
我已經從這些帖子中嘗試/檢查了以下內容: post1和post2
User Agent
和Accept
標頭。HttpURLConnection.getInputStream()
以及HttpURLConnection.getErrorStream()
,在 404 是不正確的返回代碼的情況下)並且確實得到了一個頁面未找到響應。connection.setDoOutput()
設置為true
和false
但沒有幫助。localhost
更改為127.0.0.1
。 更多信息,我查看了Tomcat
訪問日志,似乎請求從未到達服務器(意味着請求從未被記錄)。 但是,當我將 url 放入瀏覽器(並獲得有效響應)時,請求確實顯示在日志中。
還有一件事,我正在使用 eclipse 運行 tomcat。 是的,該應用程序正在服務器上部署。
另外,我發現,似乎有完全相同的問題有人在這里,但沒有辦法解決,所以我把這個問題給做的偉大的社會!
編輯:來自調用應用程序的代碼:
出於隱私原因,我隱藏了網址
public static void main(String[] args) {
final String url = "";
try {
URL obj = new URL(url);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setDoOutput(false);
System.out.println(con.getResponseCode());
System.out.println(getStringFromInputStream(con.getInputStream()));
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("DONE");
}
是的,這確實適用於其他主機,例如 google。 我從http://www.google.com
得到的回復是這樣的:
200
<!doctype html><html....>*bunch of html*</html>
DONE
回復http://localhost:8080/...
:
404
java.io.FileNotFoundException: *url*
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
at sun.net.www.protocol.http.HttpURLConnection$6.run(HttpURLConnection.java:1674)
at sun.net.www.protocol.http.HttpURLConnection$6.run(HttpURLConnection.java:1672)
at java.security.AccessController.doPrivileged(Native Method)
at sun.net.www.protocol.http.HttpURLConnection.getChainedException(HttpURLConnection.java:1670)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1243)
at Get.main(Get.java:32)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Caused by: java.io.FileNotFoundException: *url*
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1623)
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:468)
at Get.main(Get.java:31)
... 5 more
DONE
因此,通過關閉從 Eclipse 運行的 Tomcat 並重試應用程序和瀏覽器請求,我們發現某些進程正在竊取您的請求。
您可以通過運行netstat -nao | find "8080"
找到小偷netstat -nao | find "8080"
在 Windows 或netstat -nap | grep 8080
上netstat -nao | find "8080"
netstat -nap | grep 8080
Linux 上的netstat -nap | grep 8080
。 它應該顯示一行,其中包含LISTENING
和127.0.0.1:8080
,接下來是進程 ID。
我遇到了同樣的錯誤,並得到了原因,jdbc configure 中的用戶名被綁定到使用網絡地址訪問mysql,即:192.168。 . 而不是本地主機,我更改了用戶名並成功了。
我有同樣的問題,當我從瀏覽器運行https://127.0.0.1時它工作正常,但 https://localhost 或 http://localhost:8080 在瀏覽器和 Eclispe 中不起作用。 我剛剛在 Windows 上嘗試過 netstat -nao|find "8080",我得到以下結果
TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 30748
TCP 25.208.159.83:64002 165.225.39.27:8080 TIME_WAIT 0
TCP 25.208.159.83:64037 165.225.39.27:8080 TIME_WAIT 0
TCP 25.208.159.83:64117 165.225.39.27:8080 TIME_WAIT 0
TCP 25.208.159.83:64197 185.46.212.88:8080 SYN_SENT 11044
TCP 25.208.159.83:64200 165.225.39.27:8080 TIME_WAIT 0
TCP [::]:8080 [::]:0 LISTENING 30748
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.