Come inviare la richiesta POST alla pagina JSF al livello di programmazione senza utilizzare il modulo HTML?

Ho un bean JSF molto semplice come mostrato di seguito:

import org.jboss.seam.annotations.Name; @Name(Sample.NAME) public class Sample { public static final String NAME="df"; private String text = "text-test"; public void sampleM(){ System.out.println("Test: "+text); } public String getText() { return text; } public void setText(String text) { this.text = text; } } 

E il modulo JSF connesso a questo componente:

    

Ora, vorrei inviare a livello di codice la richiesta POST a questo modulo.

Secondo la mia indagine, la chiave qui sono i parametri POST. Selezionato correttamente fornisce risultati corretti (String ‘Test: test di testo’ viene stampato sulla console di serwer).

Quindi la domanda è: come dovrei selezionare i dati POST che era corretto?

Il modulo JSF mostrato sopra produce questo modulo HTML:

 

Quindi questi parametri sono corretti.

Ma come posso scoprire quali parametri (nome e valore) saranno sufficienti per qualsiasi altro componente?

Ad esempio: quando invio i dati POST come nel formato HTML mostrato ma con il valore del parametro ‘javax.faces.ViewState’ diverso, il metodo componente non verrà eseguito.

Capisco che tu stia essenzialmente chiedendo come inviare un modulo JSF a livello di programmazione usando un client HTTP come java.net.URLConnection o Apache HttpComponents Client, giusto?

È necessario prima inviare una richiesta GET e assicurarsi di mantenere la stessa sessione HTTP (in pratica, il cookie JSESSIONID ) tra le richieste. Consenti al tuo client HTTP di estrarre l’intestazione Set-Cookie dalla risposta della prima richiesta GET, ottenere il cookie JSESSIONID da esso e inviarlo come intestazione Cookie delle successive richieste POST. Ciò manterrà la sessione HTTP sul lato server, altrimenti JSF la tratterà come una “Visualizzazione scaduta” che potrebbe restituire su un’applicazione Web JSF configurata in modo ViewExpiredException pagina di errore HTTP 500 con ViewExpiredException o su un’applicazione Web JSF configurata male. come aggiornamento della pagina.

Come parte della natura di stato di JSF e della prevenzione degli attacchi implicita di CSRF, i moduli devono essere inviati con un valore javax.faces.ViewState valido quando il client si è richiamato sulla richiesta GET iniziale. È inoltre necessario assicurarsi di inviare la coppia name=value di tutti gli altri campi nascosti e in particolare quello del pulsante di invio.

Quindi, se la tua richiesta GET iniziale ti restituisce questo codice HTML

 

quindi è necessario analizzarlo ( Jsoup potrebbe essere utile in questo) ed estrarre i seguenti parametri di richiesta:

  • sampleForm=sampleForm
  • sampleForm:sampleButton=ok
  • javax.faces.ViewState=j_id65

Infine invia una richiesta POST su /pages/main/main.smnet con esattamente quei parametri di richiesta (e il cookie JSESSIONID !). Attenzione però, è ansible che uno (povero) sviluppatore JSF abbia saltato ad es. id="sampleButton" da e quindi JSF si autogenererebbe una che appare in questo formato sampleForm:j_id42 . Non è ansible eseguire l’hardcode in quanto il valore potrebbe cambiare in base alla posizione del componente nell’albero del server e sarà quindi necessario analizzarlo dall’HTML ottenuto.

Tuttavia, è consigliabile contattare il proprietario / amministratore del sito e chiedere se non è disponibile un’API del servizio Web per l’attività che avevate in mente. Un discreto sito Web Java EE che utilizza un’applicazione JSF per un frontend HTML solitamente utilizza anche un’applicazione JAX-RS separata per un frontend REST.

Guarda anche:

  • Come posso caricare un file a livello di codice in un sito Web? (questo riguarda anche JSF)
  • Utilizzare java.net.URLConnection per triggersre e gestire le richieste HTTP