簡體   English   中英

使用 HttpUrlConnection 訪問 Tomcat 時為 404,瀏覽器為 200

[英]404 when accessing Tomcat with HttpUrlConnection, 200 from browser

我收到了最奇怪的 Tomcat 錯誤。 我有一個 Web 應用程序在我的本地主機上使用 tomcat 運行在端口 8080 上,一切似乎都運行良好,沒有錯誤等。但是,當我嘗試使用 HttpURLConnection 類從另一個應用程序訪問此 Web 應用程序時,出現 404 錯誤。 奇怪的是,當我在瀏覽器中放置相同的 URL 時,它返回一個 200 代碼並有一個有效的響應。

我已經從這些帖子中嘗試/檢查了以下內容: post1post2

  1. 設置User AgentAccept標頭。
  2. 我已經檢查了響應正文(使用HttpURLConnection.getInputStream()以及HttpURLConnection.getErrorStream() ,在 404 是不正確的返回代碼的情況下)並且確實得到了一個頁面未找到響應。
  3. 我嘗試將connection.setDoOutput()設置為truefalse但沒有幫助。
  4. 嘗試將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 8080netstat -nao | find "8080" netstat -nap | grep 8080 Linux 上的netstat -nap | grep 8080 它應該顯示一行,其中包含LISTENING127.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM