404使用HttpUrlConnection访问Tomcat时,从浏览器访问200

时间:2013-07-02 19:12:52

标签: java localhost tomcat7 httpurlconnection

我收到了最奇怪的Tomcat错误。我有一个在我的localhost上使用tomcat在端口8080上运行的Web应用程序,一切似乎运行良好,没有错误等。但是,当我尝试使用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
  5. 更多信息,我查看了Tomcat访问日志,看来请求永远不会访问服务器(意味着请求永远不会被记录)。但是,当我将url放入浏览器(并获得有效响应)时,请求会显示在日志中。

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

    此外,我发现有人似乎遇到了完全相同的问题 here ,但是没有解决方案,所以我将问题提交给SO社区!

    编辑:来自app的代码:

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

     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
    

3 个答案:

答案 0 :(得分:3)

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

您可以通过在Windows上运行netstat -nao | find "8080"或在Linux上运行netstat -nap | grep 8080来找到小偷。它应显示LISTENING127.0.0.1:8080的行,然后是流程ID。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我有完全相同的问题,当我从浏览器运行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