4

我收到了最奇怪的 Tomcat 错误。我有一个使用 tomcat 在端口 8080 的本地主机上运行的 Web 应用程序,一切似乎运行良好,没有错误等。但是,当我尝试使用 HttpURLConnection 类从另一个应用程序访问此 Web 应用程序时,我收到 404 错误。奇怪的是,当我在浏览器中输入相同的 URL 时,它会返回一个 200 代码并且有一个有效的响应。

我已经从这些帖子中尝试/检查了以下内容:post1post2

  1. 设置User AgentAccept标题。
  2. 我已经检查了响应正文(在 404 是不正确的返回码的情况下使用HttpURLConnection.getInputStream()以及HttpURLConnection.getErrorStream())并且确实得到了一个找不到页面的响应。
  3. 我尝试将其设置为connection.setDoOutput()但没有帮助。truefalse
  4. 尝试更改localhost127.0.0.1.

更多信息,我查看了Tomcat访问日志,并且请求似乎永远不会到达服务器(这意味着请求永远不会被记录)。但是,当我将 url 放入浏览器(并获得有效响应)时,请求确实会显示在日志中。

还有一件事,我正在使用 eclipse 运行 tomcat。是的,该应用程序正在服务器上部署。

另外,我发现有人似乎在这里遇到了完全相同的问题,但是没有解决方案,所以我将这个问题带到了 SO 的伟大社区!

编辑:来自调用应用程序的代码:

出于隐私原因,我隐藏了网址

 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");
}

是的,这确实适用于其他主机,如谷歌。我得到的回应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
4

3 回答 3

4

因此,通过关闭从 Eclipse 运行的 Tomcat 并重试应用程序和浏览器请求,我们发现某些进程正在窃取您的请求。

netstat -nao | find "8080"您可以通过在 Windows 或netstat -nap | grep 8080Linux 上运行来找到小偷。它应该显示一行,LISTENING然后127.0.0.1:8080是进程 ID。

于 2013-07-02T23:18:55.297 回答
0

我遇到了同样的错误,并得到了原因,jdbc配置中的用户名被绑定到使用网络地址访问mysql,即:192.168。. 而不是localhost,我更改了用户名并成功。

于 2016-08-05T05:32:33.137 回答
0

我有同样的问题,当我从浏览器运行https://127.0.0.1时它工作正常,但在浏览器和 Eclispe 中运行 https://localhost 或 http://localhost:8080 不起作用。我刚刚在 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

于 2020-11-11T18:22:58.623 回答