IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Services Web Java Discussion :

HttpClient, dévérouiller une page web avec la méthode POST


Sujet :

Services Web Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti Avatar de TheLLspectre
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2014
    Messages : 43
    Par défaut HttpClient, dévérouiller une page web avec la méthode POST
    Bonjour à tous,

    Je cherche à récupérer des informations de machines (imprimantes), et pour se faire, je passe par les IPs machines qui constitue une URL référencé par le constructeur.
    Jusque là tout va très bien !

    Seulement certain des rapports disponible sur le référencement sont protégés par des mots de passes. La page se présente donc de cette façon:
    Mot de passe : _____________
    [Bouton soumettre]

    Une fois le mot de passe correcte, et le submit enclenché, la page se débloque et affiche le rapport.
    J'ai donc fait en sorte de pouvoir rentrer le mot de passe et de l'envoyer en post via HttpPost de HttpClient.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    String str = JOptionPane.showInputDialog(null, "Présence de mot de passe\n" + this.idConnexion,"Erreur !", JOptionPane.ERROR_MESSAGE);
    				List<NameValuePair> formparams = new ArrayList<NameValuePair>();
    				formparams.add(new BasicNameValuePair("login_form", str));
    				UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams, Consts.UTF_8);
    				CloseableHttpClient httpclient = HttpClients.createDefault();
    				HttpPost httppost = new HttpPost("http://" + this.getIdConnexion() +"/cgi-bin/posttest/printer/login.html");
    				httppost.setEntity(entity);
    				System.out.println(httppost.getURI());
     
    				ResponseHandler<String> rh = new ResponseHandler<String>() 
    				{
    					@Override
    					public String handleResponse(final HttpResponse response) throws IOException 
    					{
    						StatusLine statusLine = response.getStatusLine();
    						HttpEntity entity = response.getEntity();
    						if (statusLine.getStatusCode() >= 300) 
    						{
    							throw new HttpResponseException(statusLine.getStatusCode(), statusLine.getReasonPhrase());
    						}
    						if (entity == null) 
    						{
    							throw new ClientProtocolException("Response contains no content");
    						}
    						ContentType contentType = ContentType.getOrDefault(entity);
    						Charset charset = contentType.getCharset();
    						Reader reader = new InputStreamReader(entity.getContent(), charset);
    						//j'ai tenter un retour en String pour afficher le contenu
    					}
    				};
    				String ligne = httpclient.execute(httppost, rh);
    				System.out.println("CEST OK" + ligne);
    J'ai aucune idée de si la méthode POST déclenche l'activation du submit, de si il ne faudrait pas mettre en place un keepAlive, ou meme passer par les servLets.
    Je rappel que le but et qu'une fois le mot de passe entré, la page se débloque et donne accés au rapport, et ensuite moi je réimplémente mon cheminement habituel, comme pour les machines non protégé.

    Le mot de passe est bon puisque je test sur une seule machine pour en être certain du fonctionnement du programme.

    Est ce que vous aves des solutions à me proposer, pour débloquer mon chmilblique !?

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Utilse la même instance de client (HttpClient) tout au long des échanges, avec une instance de contexte unique (LocalContext).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    try( CloseableHttpClient httpClient = createHttpClient()) { // création d'une instance unique de client
     
    			final HttpClientContext localContext = HttpClientContext.create(); // création d'une instance unique de contexte
     
    			connection(httpClient, localContext); // post du formulaire pour la connexion
     
    			request1(httpClient, localContext);
    			request2(httpClient, localContext);
                            ...
     
     
     
    	    } catch (IOException e) {
    			... à traiter ...
    		}
    Un exemple de post :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    post(CloseableHttpClient httpClient, HttpClientContext localContext, String url, HttpEntity entity) throws IOException, ... {
    final HttpPost httpPost = new HttpPost(url);
    httpPost.setEntity(entity);
    try(CloseableHttpResponse response = httpClient.execute(httpPost, localContext)) { // utilisation conjointe de l'instance de httpclient et localcontext
        checkState(localContext);
     
        final HttpEntity responseEntity = response.getEntity();
     
                            ... traitement....
        }
     
    }....
    et un get
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    final HttpGet httpGet = new HttpGet(url); 
    try (CloseableHttpResponse response = httpClient.execute(httpGet, localContext)) {
     
    	checkState(localContext);
     
    	final HttpEntity responseEntity = response.getEntity();
     
                            ... traitement ...
     
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    protected void checkState(HttpClientContext localContext) throws IOException {
    	final AuthState targetAuthState = localContext.getTargetAuthState();
    	if ( targetAuthState.getState()==AuthProtocolState.FAILURE ) { 
    			throw new AuthenticationFailureException("Authentication failure", targetAuthState); // classe person étendant IOException
    	}
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre averti Avatar de TheLLspectre
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2014
    Messages : 43
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Un exemple de post :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    post(CloseableHttpClient httpClient, HttpClientContext localContext, String url, HttpEntity entity) throws IOException, ... {
    final HttpPost httpPost = new HttpPost(url);
    httpPost.setEntity(entity);
    try(CloseableHttpResponse response = httpClient.execute(httpPost, localContext)) { // utilisation conjointe de l'instance de httpclient et localcontext
        checkState(localContext);
     
        final HttpEntity responseEntity = response.getEntity();
     
                            ... traitement....
        }
     
    }....
    [/CODE]
    D'accord mais justement là c'est le traitement de la réponse que j'ai besoin... je veux juste savoir textuellement si il me retourne la page débloqué ? Car au final en y apportant des modifications je me retrouve au même point que précédemment...

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Tu peux récupèrer le contenu de la page par entity.getContent() et la parser par exemple (genre avec jsoup)...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    try(final InputStream inputStream = entity.getContent()) {
     
        final Document document = Jsoup.parse(inputStream, httpResponse.getCharset().name(), base.getURI().toString());
     
        test(document); // recherche un élément reconnaissable dans ta page (le titre, ou autre), ou un élément reconnaissable de page de login qui voudrait dire que tu n'es pas logué
     
    }
    Regarde quand même si le post ne cache pas une authenfication (dite form), ce qui permettrait simplement d'utiliser la méthode checkState, sans avoir à analyser le contenu de la page.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre averti Avatar de TheLLspectre
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2014
    Messages : 43
    Par défaut
    D'accord je ne connaissais pas du tout cette méthode !

    En revanche, voici ce que contient document au final:
    <html>
    <head></head>
    <body>
    login_form=motdepasse
    </body>
    </html>

    et là c'est embêtant .... car il ne prend pas la page dévérouillé.

    J'ai d'ailleurs trouvé quelque chose d'intéressant qui pourrait aider !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    try(final InputStream inputStream = entity.getContent()) {....} //entity de httppost
    il me donne ça:
    <html>
    <head></head>
    <body>
    login_form=motdepasse
    </body>
    </html>

    et quand je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    try(final InputStream inputStream = responseEntity.getContent()) {....} //entity de HttpResponse
    il me donne ça:
    <html>
    <head></head>
    <body> </body>
    </html>

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    C'était une réponse de principe ! C'est bien l'entity de la réponse qu'il faut exploiter pour exploiter la réponse, forcément.

    Le html de l'entity de la réponse ne correspond pas à la page que tu attends ? Est-ce qu'il n'y aurait pas une redirection ? Que donne le status de la réponse (response.getStatusLine().getStatusCode() ?
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. recupérer le code source d'une page web avec httpclient
    Par fraisa1985 dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 01/07/2008, 10h40
  2. Lancement d'une page web avec un bouton
    Par Elandril dans le forum Interfaces Graphiques en Java
    Réponses: 3
    Dernier message: 14/03/2006, 21h08
  3. Réponses: 2
    Dernier message: 19/12/2005, 13h15
  4. Ouvrir une page Web avec le navigateur
    Par BB85_TIGRIS dans le forum API standards et tierces
    Réponses: 7
    Dernier message: 17/12/2005, 09h45
  5. Son dans une page Web avec Firefox
    Par diod dans le forum Applications et environnements graphiques
    Réponses: 4
    Dernier message: 02/12/2005, 17h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo