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.