|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Apr 2004
Messaggi: 206
|
[JAVA] Probelma autenticazione ed accesso a file
Ciao a tutti, vi espongo velocemente il mio problema: sto creando una piccola applicazione che si dovrebbe connettere ad un sito, autenticarsi e scaricare un file xml. Supponendo che il file si trovi all'indirizzo http://www.nomesito.com/xml/nome_file.php (anche se ha estensione .php è di fatto un xml... non vorrei che fosse questo il problema)
Ho creato un metodo per settarmi le variabili che utilizzerò per la connessione Codice:
protected void populateURLValues(String textURL) throws IOException {
URL url = new URL(textURL);
uri = url;
host = url.getHost ();
port = url.getPort ();
if (port == -1)
port = 80;
file = url.getFile();
}
Codice:
public class MyAuthenticator extends Authenticator {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("mioNome", "miaPassword".toCharArray() );
}
}
Codice:
protected Socket connect () throws IOException {
System.err.println ("Connessione a " + host + ":" + port + "...");
Authenticator.setDefault(new MyAuthenticator()); //Possibile errore
Socket socket = new Socket(host, port);
System.err.println ("Connessione avvenuta.");
BufferedOutputStream buffOut = new BufferedOutputStream (socket.getOutputStream ());
out = new DataOutputStream (buffOut);
in = new DataInputStream (socket.getInputStream ());
return socket;
}
mentre il metodo per leggere il file (per quel che serve mi basta leggerlo) Codice:
protected void getFile() throws IOException {
System.err.println ("Richiesta del file " + file + " inviata...");
out.writeBytes ("GET " + file + " HTML/1.0\r\n\r\n"); //Probabile errore
out.flush ();
System.err.println ("Ricezione dati...");
String input ;
while ((input = in.readLine ()) != null)
System.out.println (input);
}
Ma quello che ricevo quando cerco di leggere il file è la seguente risposta: HTTP/1.1 404 Not Found Date: XXXX Server: Apache/2.0.51 (Fedora) Content-Length: 304 Connection: close Content-Type: text/html; charset=iso-8859-1 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>404 Not Found</title> </head><body> <h1>Not Found</h1> <p>The requested URL /xml/nome_file.php was not found on this server.</p> <hr /> <address>Apache/2.0.51 (Fedora) Server at xxxxxxxxxxxx Port 80</address> </body></html> Mi dite cosa sbaglio ad impostare e come dovrei farlo correttamente? Ho messo due possibili/probabili cause di errore che penso di aver individuato, ma non so come eventualmente risolverle. Riprendetemi pure se ho scritto niubbiate ^_^ |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Mi sembra però che un Authenticator viene usato dalla classe URLConnection e non da un semplice socket. Questo perché un socket non ha alcuna conoscenza della autenticazione HTTP.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#3 | |
|
Member
Iscritto dal: Apr 2004
Messaggi: 206
|
Quote:
Ho riscritto il metodo connect() con i tuoi suggerimenti Codice:
protected void connect () throws IOException {
System.err.println ("Connessione a " + host + ":" + port + "...");
URLConnection connection = uri.openConnection();
connection.setDoOutput(true);
Authenticator.setDefault(new MyAuthenticator());
System.err.println ("Connessione avvenuta.");
BufferedOutputStream buffOut = new BufferedOutputStream (connection.getOutputStream ());
out = new DataOutputStream (buffOut);
in = new DataInputStream (connection.getInputStream ());
getPage ();
}
|
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Ho fatto una prova, giusto anche per cultura mia personale
Codice:
import java.io.*;
import java.net.*;
public class ProvaAuth
{
public static void main (String[] args)
{
try
{
Authenticator.setDefault (new MyAuthenticator ());
URL url = new URL ("...url...");
URLConnection urlconn = url.openConnection ();
InputStreamReader isr = new InputStreamReader (urlconn.getInputStream ());
BufferedReader br = new BufferedReader (isr);
String str;
while ((str = br.readLine ()) != null)
{
System.out.println (str);
}
br.close ();
}
catch (Exception e)
{
e.printStackTrace ();
}
}
}
class MyAuthenticator extends Authenticator
{
protected PasswordAuthentication getPasswordAuthentication ()
{
return new PasswordAuthentication ("...user...", "...password...".toCharArray ());
}
}
E a me funziona senza problemi, la pagina generata mi dice appunto che sono loggato. Mi sta venendo un dubbio per il tuo problema ... non è che confondi l'autenticazione HTTP con una qualunque altra autenticazione fatta tramite il classico form di login nella pagina web???
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
#5 |
|
Member
Iscritto dal: Apr 2004
Messaggi: 206
|
Mmm
mi sa che è proprio come hai detto tu... a me serve autenticarmi su un sito avente la classica form di login... perdona l'equivoco ma di questo proprio non me ne intendo |
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Comunque si può sicuramente fare lo stesso ... è solo un po' più complicato. Diciamo che dovresti "mimare" quello che farebbe un browser. Su una pagina web hai un form (ci sarà quindi un tag <form>). Del form puoi sapere sicuramente il suo "action" (l'url che richiede all'invio) e il "method" (get o post). Al 99,99% un form di login è sicuramente con il post. Quindi la procedura sarebbe, a parole, la seguente: 1) Esegui un POST ad un certo URL, passando i dati richiesti (come se fosse il browser a prendere i dati dal form e ad inviarli). 2) La nuova pagina molto probabilmente gestisce le sessioni, quindi è molto probabile che ti invii un cookie che ti devi tenere da parte. 3) Le eventuali successive richieste a pagine seguenti (se devi fare altro) le devi richiedere inviando anche il cookie. In pratica devi tenere "su" la sessione mantenendo i cookie per tutto il tempo che fai richieste al server. In Java non saprei bene come fare questa cosa ... non l'ho mai fatta. Avevo fatto in passato una cosa del genere ma in Perl. Ci penso un po' e mi documento, poi magari ti faccio sapere.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:05.











mi sa che è proprio come hai detto tu...
a me serve autenticarmi su un sito avente la classica form di login... perdona l'equivoco ma di questo proprio non me ne intendo








