2013-07-02 2 views
4

Я получаю самую странную ошибку Tomcat. У меня есть веб-приложение, работающее на моем localhost на порту 8080 с использованием tomcat, и все работает отлично, никаких ошибок и т. Д. Однако, когда я пытаюсь получить доступ к этому веб-приложению из другого приложения, используя класс HttpURLConnection, я получаю ошибку 404. Странная часть заключается в том, что когда я помещаю тот же URL-адрес в браузер, он возвращает код 200 и имеет действительный ответ.404 при доступе к Tomcat с HttpUrlConnection, 200 из браузера

Я попытался/проверил следующее из этих сообщений: post1 и post2

  1. Установка User Agent и Accept заголовок.
  2. Я проверил тело ответа (с использованием HttpURLConnection.getInputStream(), а также HttpURLConnection.getErrorStream(), в случае, если 404 был неправильным кодом возврата), и я действительно получаю сообщение, не найденное на странице.
  3. Я попытался установить connection.setDoOutput() на true и false, но это не помогло.
  4. Происходит изменение localhost по 127.0.0.1.

Некоторые больше информации, я посмотрел на журналы доступа Tomcat, и оказывается, что запрос никогда не попав на сервер (это означает, запрос никогда не будет запротоколированы). Однако, когда я помещаю url в браузер (и получаю действительный ответ), запрос появляется в журналах.

Ещё одна вещь, я использую tomcat, используя затмение. И да, приложение развертывается на сервере.

Кроме того, я нашел кого-то, что по-видимому, имел точно такую ​​же проблему here, но нет никакого решения, поэтому я несу вопрос к большому сообществу SO!

EDIT: Код с вызывающим приложения:

По соображениям безопасности, я сохранил URL скрытого

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 
+0

Я бы начал с включения журнала доступа в Tomcat. Если вы вообще не видите доступа, вы почти наверняка используете другой URL-адрес (скопировали ли вы из своей Java-программы и вставили в браузер?). – parsifal

+0

Спасибо, да, я посмотрел на них, и только запросы, поступившие в журнал, находятся в браузере. И я проверил URL-адрес так много раз, что лол (потому что, по-моему, это было то, что должно было быть и этим). Они, безусловно, одинаковы. И я копирую и вставляя значение url, указанное в java-отладчике, перед запросом. – jlars62

+0

Возможно, вам следует опубликовать snipplet вашей реализации HttpURLConnection, ваша реализация «другого приложения» может подключаться к другому URL-адресу (например, google)? – jethroo

ответ

2

Таким образом, за счет отключения Tomcat, который работает с Eclipse, и повтором приложениями и браузер запросов, мы фигурный что некоторые процессы крадут ваши запросы.

Вы можете найти вора, запустив netstat -nao | find "8080" на Windows или netstat -nap | grep 8080 на Linux. Он должен показать строку с LISTENING и 127.0.0.1:8080, а следующий будет идентификатором процесса.

+0

Это сработало! Большое спасибо – jlars62

+0

@ jlars62 отлично! Пожалуйста. – yair

0

Я встречаю ту же ошибку и получил причину, имя пользователя в jdbc configure было связано с доступом к mysql с сетевым адресом, то есть: 192.168. . вместо localhost, я меняю имя пользователя и добился успеха.

Смежные вопросы