PDA

View Full Version : [java] Aprire browser con URL contenente parametri in Post


JohnMarston
28-07-2015, 12:45
Ciao! Dal mio programma java, usando la classe Desktop() riesco ad aprire la pagina che desidero sul mio browser. Ma il mio problema è che la pagina, scritta in php, per far visualizzare il contenuto, deve ricevere dei parametri in POST. Quindi come faccio a passarli? Sapete come fare?

Easlay93
28-07-2015, 12:47
utilizza le rest api in java (http://www.html.it/articoli/rest-e-java-paradigma-framework-ed-esempi-1/)

Daniels118
28-07-2015, 13:50
Non è chiaro se desideri veramente aprire la pagina nel browser o se stai semplicemente cercando di fare una post. Nel secondo caso non c'è bisogno di aprire il browser, java supporta nativamente i socket e grazie ad essi sono state implementate numerosi client http.

Se invece vuoi proprio che l'utente veda il browser con la pagina web ci sono varie possibilità più o meno complesse. La più semplice che mi viene in mente è questa:
1) da java crea un file html nel quale inserisci un form con tutti i parametri, ed aggiungi una funzione javascript per sottomettere automaticamente il form al caricamento della pagina;
2) esegui il browser passando come indirizzo: "file:///path_assoluto_del_file_creato", per esempio: "iexplorer.exe file:///C:/post.html".

JohnMarston
28-07-2015, 13:53
utilizza le rest api in java (http://www.html.it/articoli/rest-e-java-paradigma-framework-ed-esempi-1/)

devo aprire la pagina in un browser, non in stream...

Daniels118
28-07-2015, 14:03
Allora puoi provare la soluzione che ho proposto.

In alternativa, se il server è tuo (nel senso che puoi scriverci del codice) potresti anche iniettargli i dati dall'app java (salvandoli ad esempio in un db o un file temporaneo) e generare un id da usare nell'url per richiamare tali dati dal browser usando una semplice get.

JohnMarston
28-07-2015, 14:05
Non è chiaro se desideri veramente aprire la pagina nel browser o se stai semplicemente cercando di fare una post. Nel secondo caso non c'è bisogno di aprire il browser, java supporta nativamente i socket e grazie ad essi sono state implementate numerosi client http.

Sarà il caldo... :D
Devo aprire una pagina attraverso il browser, credo di essere stato chiaro... :cry:
La pagina d'altra parte per mostrare il contenuto deve ricevere un parametro che dev'essere passato attraverso post e non get. Se fosse get, l'avrei già fatto....


Se invece vuoi proprio che l'utente veda il browser con la pagina web ci sono varie possibilità più o meno complesse. La più semplice che mi viene in mente è questa:
1) da java crea un file html nel quale inserisci un form con tutti i parametri, ed aggiungi una funzione javascript per sottomettere automaticamente il form al caricamento della pagina;

:eek: ... scherzi vero??


2) esegui il browser passando come indirizzo: "file:///path_assoluto_del_file_creato", per esempio: "iexplorer.exe file:///C:/post.html".
non è quello che devo fare...

JohnMarston
28-07-2015, 14:14
Allora puoi provare la soluzione che ho proposto.

In alternativa, se il server è tuo (nel senso che puoi scriverci del codice) potresti anche iniettargli i dati dall'app java (salvandoli ad esempio in un db o un file temporaneo) e generare un id da usare nell'url per richiamare tali dati dal browser usando una semplice get.

No no... Tu scherzi... :D
Per una variabile in post devo fare tutto sto macello?? No no l'ho detto, è il caldo... ;)

Per quale ragione devo passare in get se voglio oscurare il parametro che passo?? Ci sarà un motivo se passo in post...
Piuttosto se dovessi passare in get cripto la variabile e aggiungo alla stringa dell'url... Dalla pagina catturo il parametro decripto e ho risolto. Ma non ho intenzione di muovermi in questa direzione... Per una sola variabile devo fare tutto sto casino... Non ci credo è impossibile... Sicuramente c è un modo per aprire sto browser passando url con parametro post...

Daniels118
28-07-2015, 14:16
Sarà il caldo...
Devo aprire una pagina attraverso il browser, credo di essere stato chiaro...
In realtà sei stato chiarissimo, solo che non è raro imbattersi in gente che chiede come fare cose estremamente articolate e poi scoprire che ciò che gli serviva in realtà richiedeva uno sforzo irrisorio. Vedo che non è questo il caso, ma preferisco sempre accertarmene :)

... scherzi vero??
No, non è uno scherzo, è una soluzione che funziona egregiamente. So che da questa affermazione potrebbero scatenarsi flame senza fine, ai quali mi riprometto di non rispondere. Tu tienila in considerazione.

EDIT: non avevo ancora visto il tuo ultimo post, ci penserò su...

JohnMarston
28-07-2015, 14:29
No, non è uno scherzo, è una soluzione che funziona egregiamente. So che da questa affermazione potrebbero scatenarsi flame senza fine, ai quali mi riprometto di non rispondere. Tu tienila in considerazione.

EDIT: non avevo ancora visto il tuo ultimo post, ci penserò su...

No ma va quale flame!!! Mi sparo un colpo se partono i flame... Mi credi che sto perdendo mezza giornata per questa cosa??

Riguardo al tuo suggerimento, mi sembra un po' eccessivo ho come l'impressione che mi hai frainteso o sono io che non ti seguo. Ma dall'altra parte, cioè nella pagina, ho questo:


if(isset($_POST["variabile"])){
$variabile=$_POST["variabile"];
//mostra contenuto pagina



Quindi se fosse in get, dal programma a me basta aggiungere all'url la variabile criptata:

String url = "http://miosito.com/req.php?variabile="+variabile;
Desktop.getDesktop().browse(new URI(url));


Ma per evitare volevo vedere se era possibile andare in post...

Daniels118
28-07-2015, 14:30
Per quale ragione devo passare in get se voglio oscurare il parametro che passo?? Ci sarà un motivo se passo in post...
Prima hai detto solo che volevi fare una post con il browser, non hai detto che era per oscurare i parametri, la post non serve (solo) a quello.

L'unico modo "standard" che conosco di passare qualcosa al browser è tramite url, ed ovviamente l'url non può essere nascosto.
Criptare la variabile ha un'utilità abbastanza limitata, anche se non si capisce quale sia il valore reale, può sempre essere riutilizzata.
Piuttosto dovresti generare dei token monouso e a scadenza, e passarli nell'url.

Ho capito che non vuoi passare sul disco... e lo standard input? Non so quanto sia portabile, vedi se ti va bene questo: http://unix.stackexchange.com/questions/24931/how-to-make-firefox-read-stdin

Daniels118
28-07-2015, 14:33
Ma in pratica questa variabile che cos'è? Una password?
Se si, è personale dell'utente che usa il software, o è di un'utenza tecnica (condivisa da più utenti)?

Se fornisci queste informazioni forse si può trovare una soluzione migliore, magari potrebbero anche venire alla luce falle di sicurezza...

JohnMarston
28-07-2015, 14:41
1) da java crea un file html nel quale inserisci un form con tutti i parametri, ed aggiungi una funzione javascript per sottomettere automaticamente il form al caricamento della pagina;


Ok, ragionando sul tuo suggerimento, come fai a passare le variabili alla funzione javascript?? Non lo risolvi così, o meglio, non so come tu voglia impostare la cosa, ma dal mio punto di vista il problema non lo risolvi. Alla funzione servirà un parametro e come fai a passarlo dal programma java alla pagina??

Un conto se, la pagina che ricevere e si deve aprire, accetta una "costante" e quindi mostra il contenuto, indipendentemente da chi effettua l'azione, ma che ragione avrei di passarla in post? La lascio nella pagina metto link e si apre il browser con tutto il contenuto oppure la tolgo del tutto...
A me occorre quella variabile perché rintraccio l'utente attraverso quel parametro e mostro il rispettivo contenuto...

Poi se tu riesci a risolvere tutte queste problematiche sarò lieto di implementare il tuo suggerimento. Posta qualche riga così capisco meglio come lo risolvi.

Daniels118
28-07-2015, 14:46
La variabile viene cablata nel form html all'atto della scrittura del file.
Ecco il pseudo-codice da inserire nel programma java:
String s = "<html>
<form name="mio_form" method=\"post\" action=\"http://miosito.com/req.php\">
<input type=\"hidden\" name=\"variabile\" value=\"" + variabile + "\">
</submit>
<script>
forms['mio_form'].submit();
</script>
</html>";
ClasseACME.writeStringToFile(s, "C:\submit.html");
Process p = ClasseACME.execute("iexplorer.exe file:///C:/submit.html");
Thread.sleep(2000);
ClasseACME.delete("C:\submit.html");
Può darsi che abbia sbagliato la sintassi del codice javascript, non la ricordo a memoria, ma il concetto è quello.

Il programma java crea una pagina web sul disco locale contente un form già precompilato che punta al tuo sito.
Quando il browser apre il file, il codice javascript sottomette automaticamente il form, e nel browser viene visualizzata direttamente la risposta alla post del tuo sito.

JohnMarston
28-07-2015, 14:48
Prima hai detto solo che volevi fare una post con il browser, non hai detto che era per oscurare i parametri, la post non serve (solo) a quello.

Ma scusa dove vedi scritto che io devo fare una post?? Ho scritto che devo passare un parametro in post attraverso url.

L'unico modo "standard" che conosco di passare qualcosa al browser è tramite url, ed ovviamente l'url non può essere nascosto.

Esatto, però la variabile la devo oscurare...


Criptare la variabile ha un'utilità abbastanza limitata, anche se non si capisce quale sia il valore reale, può sempre essere riutilizzata.

Ma infatti per questa ragione non desidero passare la variabile in get ma in post...

Daniels118
28-07-2015, 14:53
Ho scritto che devo passare un parametro in post attraverso url.
Nun se po fa :D

Comunque puoi inventarti quello che vuoi, l'utente smaliziato, l'acaro di turno, riuscirà sempre a spiare quello che esce dal proprio pc. Se è per un esperimento o per un progetto amatoriale va bene, ma non affiderei mai il mio conto corrente ad un sistema del genere. :D

JohnMarston
28-07-2015, 14:54
La variabile viene cablata nel form html all'atto della scrittura del file.
Ecco il pseudo-codice da inserire nel programma java:
String s = "<html>
<form name="mio_form" method=\"post\" action=\"http://miosito.com/req.php\">
<input type=\"hidden\" name=\"variabile\" value=\"" + variabile + "\">
</submit>
<script>
forms['mio_form'].submit();
</script>
</html>";
ClasseACME.writeStringToFile(s, "C:\submit.html");
Process p = ClasseACME.execute("iexplorer.exe file:///C:/submit.html");
Thread.sleep(2000);
ClasseACME.delete("C:\submit.html");
Può darsi che abbia sbagliato la sintassi del codice javascript, non la ricordo a memoria, ma il concetto è quello.

Il programma java crea una pagina web sul disco locale contente un form già precompilato che punta al tuo sito.
Quando il browser apre il file, il codice javascript sottomette automaticamente il form, e nel browser viene visualizzata direttamente la risposta alla post del tuo sito.

Ooooh va che bravo... adesso ho capito cosa suggerivi di fare... Devo provare e ti faccio sapere, anche se non mi sono chiari alcuni passaggi.
Ma è già qualcosa, ti ringrazio!

A occhio credo che funzioni... Sei stato molto gentile!!!!

JohnMarston
28-07-2015, 14:58
Nun se po fa :D


Questa è già una risposta!!! Con un "non si può fare", alla fine si cerca la furbata per bypassare il limite, ma fino ad ora credimi che non ho letto da nessuna parte che non si poteva fare...

JohnMarston
28-07-2015, 15:37
problemi qui...
cosa serve che non mi è chiaro il passaggio??

ClasseACME.writeStringToFile(s, "C:\submit.html");
Process p = ClasseACME.execute("iexplorer.exe file:///C:/submit.html");
Thread.sleep(2000);
ClasseACME.delete("C:\submit.html");



"ClasseACME" sta per?

Daniels118
28-07-2015, 16:37
Hai mai visto Wile il coyote? Tutti i marchingegni che utilizzava erano prodotti dalla ACME (A Company Making Everything, ovvero azienda che produce qualsiasi cosa); siccome non ricordo o non esistono classi standard per fare quelle operazioni ho supposto l'esistenza di una fantomatica Class Making Everything. :)
Conosci giá la classe per aprire il browser, dovrai usare un filewriter per scrivere il file. La classe file ti consente di cancellare il file.

JohnMarston
28-07-2015, 16:43
ok direi che grazie all'intervento di Daniels118 ho risolto... Nel mio piccolo ho aggiunto qualcosa per correggere.
Posto il codice, magari a qualcuno può servire.


import org.apache.commons.io.FileUtils;

public void sendPost(String variabile) {

try {

String s = "<html>\n" +
"<form name=\"FormType\" method=\"post\" action=\"http://miosito.com/req.php\">\n" +
"<input type=\"hidden\" name=\"variabile\" value=\""+variabile+"\">\n" +
"</form>\n" +
"<script type=\"text/javascript\">\n" +
" function autoClick () {\n" +
" document.forms[\"FormType\"].submit();\n" +
" }\n" +
" window.onload = autoClick;\n" +
"</script> \n" +
"</html>";

File htmlTemplateFile = new File("C:\\temp\\submit.html");
FileUtils.writeStringToFile(htmlTemplateFile, s);
Desktop.getDesktop().open(htmlTemplateFile);
try {
Thread.sleep(2000);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
htmlTemplateFile.delete();

} catch (IOException e){
e.printStackTrace();
}
}

JohnMarston
28-07-2015, 16:49
Hai mai visto Wile il coyote? Tutti i marchingegni che utilizzava erano prodotti dalla ACME (A Company Making Everything, ovvero azienda che produce qualsiasi cosa);

Scusa... È il caldo!!! Ahahahah
Comunque ottima soluzione!!! Non ci avevo pensato a risolverla così, in realtà non ci sarei neanche arrivato!!!

Grazie!

Daniels118
28-07-2015, 17:33
E' stato un piacere :)

P.S. nell'esempio ho dimenticato di inserire i tag body, andrebbero messi!

Ciao
Daniele