2013-04-24 32 views
5

Sto cercando di creare un'utilità is-website-down con java, ma ho alcuni problemi.Verifica se il sito web esiste

C'è un modo per verificare se esiste un sito Web? Ho provato questo per vedere se un sito è giù:

URL url = new URL("http://localhost"); 
HttpURLConnection httpConnection = (HttpURLConnection) (url.openConnection()); 
int code = httpConnection.getResponseCode(); 
System.out.println("code: " + code); 

Si passa attraverso IOException per Connection refused: connect quando cioè provo a collegarmi a localhost, mentre non esiste un server http ascolto attivo (il sito è giù).

ho pensato che sarebbe successo la stessa cosa con qualche sito che in realtà non esiste cioè

URL url = new URL("http://www.sdfasfjkhaslfjkhaslkdjfhasldkjf.it"); 

Ma ricevo un codice di stato HTTP 200 perché il mio ISP mi reindirizza automaticamente a una pubblicità pagina a caso se il il sito che sto cercando non esiste.

Quindi, se un sito non è attivo, il mio programma dice "Beh, il tuo sito web non funziona", ma se il sito non esiste il mio programma dice "Oh, il tuo sito web è attivo e funzionante!", E non è così veramente buono.

C'è un modo per verificare se esiste un sito Web?

+6

Wow, che un cattivo ISP. – eboix

+0

@eboix Sì. Sfortunatamente, penso che ogni ISP italiano funzioni come questo – BackSlash

+0

Se il tuo ISP ti reindirizza in questo modo, puoi anche supporre che non sia disponibile. –

risposta

1

Leggere i commenti sull'avvelenamento DNS dell'ISP. Il tuo ISP ti sta dando/leasing un server DNS su cui ha il controllo, che cattura tutte le risposte NXDOMAIN e restituisce un risultato avvelenato a un server che controlla.

Farei un controllo DNS per un record A con qualcosa come Google Public DNS o un altro server DNS valido noto pubblicamente prima di eseguire il controllo HTTP. Il DNS pubblico di Google restituisce NXDOMAIN quando il dominio non è valido. In Java, potrebbe essere necessario utilizzare qualcosa come dnsjava per ottenere l'accesso diretto ai record DNS necessari.

Alla fine, effettuare due verifiche, una per un record DNS valido contro una sorgente nota, quindi un'altra per vedere se HTTP è attivo.

+1

Come posso controllare i DNS di google senza averli impostati? Non posso chiedere all'utente dell'applicazione di modificare le sue impostazioni DNS, c'è un modo per "chiederle" se un sito Web viene risolto senza impostarlo come DNS di default? – BackSlash

+0

Non cambierai i server DNS dell'utente finale. Avresti impostato il server DNS nella tua applicazione per fare la ricerca. Se apri un prompt dei comandi/sessione di terminale digita "nslookup kjfksadljfksl.com", digita "nslookup kjfksadljfksl.com 8.8.8.8'. Stai dicendo a 'nslookup' di fare la ricerca contro Google, e non contro i server DNS del tuo ISP. Faresti una cosa simile nel tuo codice. –

+0

'nslookup kjfksadljfksl.com 8.8.8.8' significa che devo eseguire i comandi del terminale dalla mia applicazione java, sarebbe meglio se non lo facessi ... Proverò dnsjava, forse risolverà tutti i miei problemi! – BackSlash

1

Appena trovato Java - How to find the redirected url of a url? che suggerisce l'impostazione di httpConnection.setFollowRedirects (false), questo potrebbe aiutare se stanno eseguendo i reindirizzamenti effettivi. Se non stanno reindirizzando, ma stanno semplicemente servendo i loro contenuti, non sono sicuro che ci sia molto da fare tranne rilevare se il contenuto è quello che ti aspettavi o se è pubblicità.

0

Si consiglia di aggiungere:

HttpURLConnection.setFollowRedirects(false); 
// note : or 
//  httpConnection.setInstanceFollowRedirects(false); 

e controllo:

(httpConnection.getResponseCode() == HttpURLConnection.HTTP_OK)