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

Servlets/JSP Java Discussion :

Simuler un POST dans une JSP


Sujet :

Servlets/JSP Java

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 41
    Points : 13
    Points
    13
    Par défaut Simuler un POST dans une JSP
    Bonjour,

    j'aimerais simuler l'envoi d'un formulaire avec la methode POST.
    Actuellement j'ai une page JSP qui possède un formulaire qui emet la requette suivante :

    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
    http://casatosorigin.dyndns.org:8081/opiam/logon.do
     
    POST /opiam/logon.do HTTP/1.1
    Host: casatosorigin.dyndns.org:8081
    User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.3) Gecko/20061201 Firefox/2.0.0.3 (Ubuntu-feisty)
    Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
    Accept-Language: fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3
    Accept-Encoding: gzip,deflate
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
    Keep-Alive: 300
    Connection: keep-alive
    Referer: http://casatosorigin.dyndns.org:8081/opiam/?ticket=ST-22-knGl9t4upFmI4KdUKD2XQ0IUmmKE7vgDmxU-20
    Cookie: JSESSIONID=83633B1777912C48804DE0E072882B16; additionalInfoFromCAS=sprain
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 38
    login=scarter&password=sprain&x=35&y=5
    HTTP/1.x 200 OK
    Server: Apache-Coyote/1.1
    Content-Type: text/html;charset=ISO-8859-1
    Content-Length: 918
    Date: Tue, 12 Jun 2007 14:52:13 GMT
    j'aimerais pourvoir générer la meme requette en me connectant sur une autre JSP.

    en gros, j'aimerais realiser une JSP qui créé cette requette, mais je n'y parviens pas. J'ai testé ca :

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <%@ page language="java"  %>
    <%
            String cookieName = "additionalInfoFromCAS";
            Cookie cookies [] = request.getCookies ();
            Cookie myCookie = null;
            String userLogin = null;
            String userPassword = null;
            if (cookies != null)
            {
                    for (int i = 0; i < cookies.length; i++)
                    {
                            if (cookies [i].getName().equals (cookieName))
                            {
                                    myCookie = cookies[i];
                                    break;
                            }
                    }
            }
            //si le cookie contenant les informations issues de CAS existe,
            //on récupère le login et le password.
            if (myCookie != null)
            {
                    userLogin = request.getRemoteUser();
                    userPassword = myCookie.getValue();
            }
            //envoie de la requette POST pour valider le formulaire d'OPIAM
    try {
            // Construct data
            //String data = java.net.URLEncoder.encode("user", "UTF-8") + "=" + java.net.URLEncoder.encode(userLogin, "UTF-8");
            //data += "&" + java.net.URLEncoder.encode("password", "UTF-8") + "=" + URLEncoder.encode(userPassword, "UTF-8");
            String data = "login=scarter&password=sprain";
     
            // Send data
            java.net.URL url = new java.net.URL("http://applisatosorigin.dyndns.org:8080/opiam2/logon.do");
            java.net.URLConnection conn = url.openConnection();
            conn.setDoOutput(true);
            java.io.OutputStreamWriter wr = new java.io.OutputStreamWriter(conn.getOutputStream());
            wr.write(data);
            wr.flush();
        
            // Get the response
            java.io.BufferedReader rd = new java.io.BufferedReader(new java.io.InputStreamReader(conn.getInputStream()));
            String line;
            String pagecontent =  "";
            while ((line = rd.readLine()) != null) {
                // Process line...
                    pagecontent += line;
            }
            wr.close();
            rd.close();
        } catch (Exception e) {
        }
    %>
    sans succès.

    merci pour vos remarques

    Aswat

  2. #2
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 41
    Points : 13
    Points
    13
    Par défaut POST avec httpclient dans une JSP
    en cherchant d'autres solutions potentielles à mon problème je suis tombé sur le projet HttpClient d'Apache. j'ai donc éssayé d'intégrer ca dans ma JSP, ce qui donne ca :

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <%@ page language="java"  %>
    <%@ page import="java.io.IOException;"%>
    <%@ page import="org.apache.commons.httpclient.HttpClient;"%>
    <%@ page import="org.apache.commons.httpclient.HttpException;"%>
    <%@ page import="org.apache.commons.httpclient.methods.PostMethod;"%>
    <%
            String cookieName = "additionalInfoFromCAS";
            Cookie cookies [] = request.getCookies ();
            Cookie myCookie = null;
            String userLogin = null;
            String userPassword = null;
            if (cookies != null)
            {
                    for (int i = 0; i < cookies.length; i++)
                    {
                            if (cookies [i].getName().equals (cookieName))
                            {
                                    myCookie = cookies[i];
                                    break;
                            }
                    }
            }
            //si le cookie contenant les informations issues de CAS existe,
            //on récupère le login et le password.
            if (myCookie != null)
            {
                    userLogin = request.getRemoteUser();
                    userPassword = myCookie.getValue();
            }
            //envoie de la requette POST pour valider le formulaire d'OPIAM
     
            HttpClient client = new HttpClient();
     
            // Adresse du formulaire à soumettre
            String postUrl = "http://applisatosorigin.dyndns.org:8080/opiam2/logon.do";
            PostMethod method = new PostMethod(postUrl);
     
            // Champs du formulaire à renseigner
            method.addParameter("user", userLogin);
            method.addParameter("password", userPassword);
     
            try 
            {
                    client.executeMethod(method);
                    String body = method.getResponseBodyAsString();
     
                    // Il est aussi possible de récupérer le résultat sous
                    // forme de flux InputStream avec getResponseBodyAsStream()
                    System.out.print(body);
     
            } catch (HttpException e) {
                    e.printStackTrace();
            } catch (IOException e) {
                    e.printStackTrace();
            } finally {
                    // Libération des ressources
                    method.releaseConnection();
            }
    %>
    cependant la JSP ne compile pas, j'ai bien inclus commons-httpclient-3.0.1.jar
    et commons-logging.jar

    mais j'obtient ca :

    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
    34
    35
    11:14,261 ERROR org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/opiam2].[jsp] - "Servlet.service()" pour la servlet jsp a généré une exception
    org.apache.jasper.JasperException: Impossible de compiler la classe pour la JSP:
     
     
     
     
    Stacktrace:
            at org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:85)
            at org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:330)
            at org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:435)
            at org.apache.jasper.compiler.Compiler.compile(Compiler.java:298)
            at org.apache.jasper.compiler.Compiler.compile(Compiler.java:277)
            at org.apache.jasper.compiler.Compiler.compile(Compiler.java:265)
            at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:564)
            at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:299)
            at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:315)
            at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
            at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
            at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
            at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
            at edu.yale.its.tp.cas.client.filter.CASFilter.doFilter(CASFilter.java:401)
            at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
            at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
            at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:210)
            at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
            at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
            at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
            at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
            at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151)
            at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:870)
            at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
            at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
            at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
            at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:685)
            at java.lang.Thread.run(Thread.java:595)

  3. #3
    Membre éclairé Avatar de Pollux
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    706
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2005
    Messages : 706
    Points : 680
    Points
    680
    Par défaut
    simuler une requête post? c'est quoi le problème?

    requête post signifie passage des données à uploader au serveur par un formulaire... ce qui donne pour toi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <form action='taServlet' method='post'>
    <input type='text' name='login' />
    </form>
    Dans cette situation tu auras dans ta requête post:

    login=la valeur entrée par l'utilisateur

    Ensuite chaque paramètre est séparé par un &

  4. #4
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 41
    Points : 13
    Points
    13
    Par défaut
    euh, je pense que tu n'as pas compris ce que je recherche a faire.

    En gros jusqu'ici, le point d'entré de mon application était un formulaire dans une jsp, il resemble à ca :
    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
    <html:form action="/logon" method="POST" focus="login" target="_parent" >
                     <TABLE cellpadding="0" cellspacing="0" border="0" summary="Login" align="center" class="body" width="100%">
                       <TR><TD><BR/></TD></TR>
                       <TR><TD align="left">Login&nbsp;:&nbsp;</TD>
                       <TD>
    			 <html:text property="login" size="20" maxlength="128"/>
                       </TD>
                       </TR>
                       <TR><TD><BR/></TD></TR>
                       <TR><TD align="left">Password&nbsp;:&nbsp;</TD>
                       <TD>
                       <html:password property="password" size="20" maxlength="128" redisplay="false"/>
                       </TD>
                       </TR>
                       <TR><TD><BR/></TD></TR>
                       <TR><TD colspan="2" align="center">
                       <INPUT type="image" src="<%=request.getContextPath()%>/images/ok_button.gif" border="0" alt="Ok" title="Log on">
                       </TD>
                                                </TR>
                                                <TR><TD><BR/><BR/></TD></TR>
                                                <TR><TD colspan="2" align="center">Please enter your login and password.</TD></TR>
                                            </TABLE>
                                        </html:form>
    Maintenant, je doit remplacer ce formulaire remplis par l'utilisateur par un formulaire POST-é automatiquement. La première partie de ma JSP recupère la liste des cookies et s'en sert pour "remplir" le formulaire. Ensuite la deuxième partie de ma JSP devra envoyer ce formulaire remplis via POST. Seulement je n'y parviens pas encore. Pour information, j'avais déjàs fait un truc similaire en Perl qui resemblais à ca :

    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
    #!/usr/bin/perl
    #agent LemonLDAP pour protéger l'application OPIAM-demo
     
    use LWP::UserAgent;
    use CGI;
    use Cwd;
    my $dir = getcwd;
    my $ua = LWP::UserAgent->new;
    my $req = HTTP::Request->new(POST => 'http://opiam.example.com:8080/demo/logon.do');
    $req->content_type('application/x-www-form-urlencoded');
     
    # On transmet le login + password de l'utilisateur pour simuler la connection
    $req->content("login=$ENV{HTTP_UID}&password=$ENV{HTTP_PASSWORD}");
    my $res = $ua->request($req);
    my %headers = %{$res->headers};
    my $cgi=CGI->new;
    my %cgiHeaders;
    $cgiHeaders{'-type'} = $headers{'Content-Type'} || 'text/html';
    foreach(keys %headers) {
    	next if(/Content-Type/);
    	$cgiHeaders{"-$_"} = $headers{$_};
    }
    print $cgi->header(%cgiHeaders);
    print $res->content;
    J'espere que tu as compris ce que je voulais dire.

    Merci pour votre aide

    aswat

  5. #5
    Membre éclairé Avatar de Pollux
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    706
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2005
    Messages : 706
    Points : 680
    Points
    680
    Par défaut
    ok j'avais pas compris les choses comme ca en effet

    tes directives page import, il faut que tu enlèves le ';' à la fin

  6. #6
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 41
    Points : 13
    Points
    13
    Par défaut
    merci Pollux, en effet j'avais pas vu les ;

    Mais en fait le problème c'est que j'utilise le SSO CAS et que lorsque j'appel /logon, je tombe sur le filtre de CAS qui vérifie que j'ai bien le cookie qui va bien, le problème c'est que mon code s'execute coté serveur et que forcement les cookies ne sont pas présents. J'essaye donc de rajouter mes cookies à la requetes. Problème : au début j'ai des javax.servlet.http.Cookie et je doit les transformer en org.apache.commons.httpclient.Cookie. Pour ce faire, je n'ai pas trouvé de methode simple donc je lit et j'ecris la valeur dan sle nouveau. Seulement bizzarement, cookie.getDomain() et cookie.getPath() me renvoient null alors que je sais pertinament qu'ils ne sont pas null (ce que me confirme Web Developper Toolbar ). Vous avez une idée qui expliquerais cela ?

    sinon voila ou en est mon code actuel :
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <%@ page language="java"  %>
    <%@ page import="java.util.Date"%>
    <%@ page import="java.io.IOException"%>
    <%@ page import="org.apache.commons.httpclient.HttpClient"%>
    <%@ page import="org.apache.commons.httpclient.HttpState        "%>
    <%@ page import="org.apache.commons.httpclient.HttpException"%>
    <%@ page import="org.apache.commons.httpclient.methods.PostMethod"%>
    <%
            String cookieName = "additionalInfoFromCAS";
            Cookie cookies [] = request.getCookies ();
            org.apache.commons.httpclient.Cookie[] cookiesADeplacer = new org.apache.commons.httpclient.Cookie[cookies.length];
            Cookie myCookie = null;
            String userLogin = null;
            String userPassword = null;
            if (cookies != null)
            {
                    for (int i = 0; i < cookies.length; i++)
                    {
                            System.out.println("COOKIE -N-"+i);
                            System.out.println("cookie initial :");
                            System.out.println(cookies[i].getName());
                            System.out.println(cookies[i].getValue());
                            System.out.println(cookies[i].getDomain());
                            System.out.println(cookies[i].getPath());
                            System.out.println(cookies[i].getSecure());
                            System.out.println(cookies[i].getMaxAge());
                            System.out.println("------------");
                            String domain = cookies[i].getDomain();
                            String name = cookies[i].getName();
                            String value = cookies[i].getValue();
                            String path = cookies[i].getPath();
                            boolean secure = cookies[i].getSecure();
                            int maxAge = cookies[i].getMaxAge();
                            cookiesADeplacer[i] = new org.apache.commons.httpclient.Cookie(domain, name, value, path,maxAge, secure);             System.out.println("nouveau cookie :");
                            System.out.println(cookiesADeplacer[i].getName());
                            System.out.println(cookiesADeplacer[i].getValue());
                            System.out.println(cookiesADeplacer[i].getDomain());
                            System.out.println(cookiesADeplacer[i].getPath());
                            System.out.println(cookiesADeplacer[i].getSecure());
                            System.out.println(cookiesADeplacer[i].getExpiryDate());
                            System.out.println("------------");
                            System.out.println("------------");
                            if (cookies [i].getName().equals (cookieName))
                            {
                                    myCookie = cookies[i];
                                    break;
                            }
                    }
            }
            /*
            for (int i = 0; i < cookies.length; i++)
            {
                    System.out.println(cookiesADeplacer[i].getName());
            }
            //si le cookie contenant les informations issues de CAS existe,
            //on récupère le login et le password.
            if (myCookie != null)
            {
                    userLogin = request.getRemoteUser();
                    userPassword = myCookie.getValue();
            }
     
            HttpState initialState = new HttpState();
            HttpClient client = new HttpClient();
     
            // on insert les cookies venant de CAS dans la requete afin de ne pas etre bloqué par CAS-Filter
            initialState.addCookies(cookiesADeplacer);
            client.setState(initialState);
    // Adresse du formulaire à soumettre
            String postUrl = "http://applisatosorigin.dyndns.org:8080/opiam2/logon";
            PostMethod method = new PostMethod(postUrl);
     
            // Champs du formulaire à renseigner
            method.addParameter("user", userLogin);
            method.addParameter("password", userPassword);
            try
            {
                    client.executeMethod(method);
                    String body = method.getResponseBodyAsString();
     
                    // Il est aussi possible de récupérer le résultat sous
                    // forme de flux InputStream avec getResponseBodyAsStream()
                    System.out.print(body);
     
            } catch (HttpException e) {
                    e.printStackTrace();} catch (IOException e) {
                    e.printStackTrace();
            } finally {
                    // Libération des ressources
                    method.releaseConnection();
            }*/
    %>

  7. #7
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 41
    Points : 13
    Points
    13
    Par défaut
    Bon j'ai laissé tombé cette solution et j'ai utilisé du javascript : resultat 3 lignes !! et ca marche.

Discussions similaires

  1. [ XML ][ XSL ][ JSP ] afficher du xml dans une JSP
    Par zozolh2 dans le forum Servlets/JSP
    Réponses: 9
    Dernier message: 17/07/2009, 20h34
  2. La methode POST dans une page JSP
    Par fadex dans le forum Servlets/JSP
    Réponses: 8
    Dernier message: 10/05/2006, 21h53
  3. [jsp] include dynamique dans une jsp
    Par petitelulu dans le forum Servlets/JSP
    Réponses: 9
    Dernier message: 04/03/2005, 07h59
  4. navigation dans une jsp avec javascript
    Par petitelulu dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 15/11/2004, 18h55
  5. [struts][jsp]Inclusion dans une jsp
    Par GreenJay dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 17/06/2004, 11h43

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