hc-httpclient-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Michael Becke <mbe...@gmail.com>
Subject Re: multiple instances of httpclient
Date Sat, 20 Aug 2005 19:07:55 GMT
Hi Keith,

Try calling:

Cookie[] cookieAfter = state.getCookies();

instead of:

Cookie[] cookieAfter = client.getState().getCookies();

Mike

On 8/19/05, Keith Campbell <keithcampbell@mac.com> wrote:
> Hi Mike,
> 
> Thanks for the help -
> 
> I've modified my code to use a MultiThreadedHttpConnectionManager and
> I'm using the method
> you suggested -  HttpClient.executeMethod(HostConfiguration,
> HttpMethod, HttpState).
> 
> To maintain persistence - I assume I still need to set/get Cookies
> from the user session.
> The following code works until the last bit where I try to retrieve
> the cookie after the GET method was executed. (Cookie[] cookieAfter =
> client.getState().getCookies();)
> The cookies have a null value and so I lose persistence.
> 
> 
> // Create a GET method instance.
>          GetMethod method = new GetMethod(BASE_LOCKWOOD_POST_URL +
> duiUrl);
> 
>          // set the query string passed in from CC
>          method.setQueryString(queryString);
> 
>          // Provide custom retry handler if necessary
>          method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
>                  new DefaultHttpMethodRetryHandler(3, false));
> 
>          // get cookies from this user's session
>          Cookie[] cookie = (Cookie[]) request.getSession().getAttribute(
>                  "cookie");
> 
>          // get a new Host configuration and set the Host and port
>          HostConfiguration config = new HostConfiguration();
>          config.setHost("24.167.26.100",8083);
> 
>          // instantiate a new HttpState and set the cookies from the
> session
>          HttpState state = new HttpState();
>          state.addCookies(cookie);
> 
>          // execute the GET method
>          try {
>              int statusCode = client.executeMethod(config, method,
> state);
> 
>              if (statusCode != HttpStatus.SC_OK) {
>                  System.out.print("Method failed: " +
> method.getStatusLine());
>              } else {
>                  // get the response as a String
>                  xml = method.getResponseBodyAsString();
>              }
>          } catch (HttpException he) {
>              System.out.print("Fatal protocol violation: " +
> he.getMessage());
>              he.printStackTrace();
>          } catch (IOException ioe) {
>              System.out.print("Fatal transport error: " +
> ioe.getMessage());
>              ioe.printStackTrace();
>          } finally {
>              method.releaseConnection(); // Release the connection.
>          }
> 
>          Cookie[] cookieAfter = client.getState().getCookies();
>          request.getSession().setAttribute("cookie",cookieAfter);
> 
> 
> On Aug 18, 2005, at 11:33 PM, Michael Becke wrote:
> 
> > Hi Keith,
> >
> > You don't want to share HttpState among different users.  You should
> > use HttpClient.executeMethod(HostConfiguration, HttpMethod, HttpState)
> > and pass in an instance of HttpState unique to each user.  Also make
> > sure you're using a http connection manager that support multiple
> > threads.
> >
> > Mike
> >
> > On 8/18/05, Keith Campbell <keithcampbell@mac.com> wrote:
> >
> >> Yes -- that worked. One last question if somebody could answer:
> >> Because of implementing it this way -- I think I need to create a
> >> synchronized block
> >> where I clear and set cookies from the HttpClient. But I'm concerned
> >> that this might
> >> be too big of a performance hit if I have many concurrent users.
> >> Could somebody quickly take a look at my code and let me know if
> >> there's some way to possibly speed this up or is this the best I can
> >> hope for?
> >>
> >> package com.paperloop.bus;
> >>
> >> import java.io.IOException;
> >>
> >> import javax.servlet.http.HttpServletRequest;
> >>
> >> import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler;
> >> import org.apache.commons.httpclient.HttpException;
> >> import org.apache.commons.httpclient.HttpStatus;
> >> import org.apache.commons.httpclient.HttpClient;
> >> import org.apache.commons.httpclient.Cookie;
> >> import org.apache.commons.httpclient.HttpState;
> >> import org.apache.commons.httpclient.methods.GetMethod;
> >> import org.apache.commons.httpclient.params.HttpMethodParams;
> >>
> >> public class DUIHtmlProvider implements HTMLProvider {
> >>
> >>      private String xml;
> >>      private static String BASE_LOCKWOOD_POST_URL = "http://
> >> xxx.xxx.xxx.xxx:8083/pl_dui/";
> >>
> >>      public DUIHtmlProvider(HttpServletRequest request, HttpClient
> >> client) {
> >>
> >>          String duiUrl = request.getParameter("url"), queryString;
> >>
> >>          // has this user logged in to DUI yet?
> >>          if (duiUrl == null) {
> >>              // no url within DUI yet -- must be new user
> >>              duiUrl = "index.php";
> >>              // set GET query string to login query string
> >>              queryString = "pcd=NS&uid="+request.getParameter("uid");
> >>          } else {
> >>              // user has a url -- already logged in
> >>              queryString = request.getQueryString();
> >>          }
> >>
> >>          // Create a GET method instance.
> >>          GetMethod method = new GetMethod(BASE_LOCKWOOD_POST_URL +
> >> duiUrl);
> >>
> >>          // set the query string passed in from CC
> >>          method.setQueryString(queryString);
> >>
> >>          // Provide custom retry handler is necessary
> >>          method.getParams().setParameter
> >> (HttpMethodParams.RETRY_HANDLER,
> >>                  new DefaultHttpMethodRetryHandler(3, false));
> >>
> >>          // get cookies from this user's session
> >>          Cookie[] cookie = (Cookie[]) request.getSession
> >> ().getAttribute(
> >>                  "cookie");
> >>
> >>          // we don't want users' to execute a GET or POST
> >>          // while somebody else's cookies are set in the HTTP
> >>          // client, so this block is synchronized (Performance
> >>          // hit should be negligible but maybe should be tested??)
> >>          synchronized (client) {
> >>
> >>              // get the client HTTP state
> >>              HttpState state = client.getState();
> >>
> >>              // clear cookies from the HTTP client
> >>              state.clearCookies();
> >>
> >>              // restore this user's cookies to the HTTP client state
> >>              state.addCookies(cookie);
> >>
> >>              // add the HttpState back to the client
> >>              client.setState(state);
> >>
> >>              // execute the GET method
> >>              try {
> >>                  int statusCode = client.executeMethod(method);
> >>
> >>                  if (statusCode != HttpStatus.SC_OK) {
> >>                      System.out.print("Method failed: " +
> >> method.getStatusLine());
> >>                  } else {
> >>                      // get the response as a String
> >>                      xml = method.getResponseBodyAsString();
> >>                  }
> >>
> >>              } catch (HttpException he) {
> >>                  System.out.print("Fatal protocol violation: " +
> >> he.getMessage());
> >>                  he.printStackTrace();
> >>              } catch (IOException ioe) {
> >>                  System.out.print("Fatal transport error: " +
> >> ioe.getMessage());
> >>                  ioe.printStackTrace();
> >>              } finally {
> >>                  method.releaseConnection(); // Release the
> >> connection.
> >>              }
> >>
> >>              // get the Cookies from the HTTP client
> >>              // and set them in the user's Session
> >>              Cookie[] cookieAfter = client.getState().getCookies();
> >>              request.getSession().setAttribute("cookie",cookieAfter);
> >>          }
> >>      }
> >>
> >>      public String getHtml() {
> >>          return xml;
> >>      }
> >>
> >> }
> >>
> >>
> >>
> >>
> >>
> >>
> >>
> >> On Aug 18, 2005, at 7:52 PM, Gustavo Hexsel wrote:
> >>
> >>
> >>>   I believe you're right.  Things might get tricky if you need the
> >>> credentials present in the HttpState too, but it doesn't appear to
> >>> be your
> >>> case.
> >>>
> >>>   I'm guessing that, while the user's session is active, it's
> >>> easier to keep
> >>> the whole HttpState in it, to avoid creating and setting cookies
> >>> all the
> >>> time.  But I see that HttpState isn't serializable so you might be
> >>> out of
> >>> luck there.
> >>>
> >>>   []s Gus
> >>>
> >>>
> >>>
> >>> -----Original Message-----
> >>> From: Keith Campbell [mailto:keithcampbell@mac.com]
> >>> Sent: August 18, 2005 5:48 PM
> >>> To: HttpClient User Discussion
> >>> Subject: Re: multiple instances of httpclient
> >>>
> >>>
> >>> Hi again,
> >>>
> >>> I think I may have answered my question but please tell me if I'm on
> >>> the right track or not ....
> >>>
> >>> I  think I can maintain multiple user sessions using one instance of
> >>> HttpClient if I do something like the following:
> >>>
> >>> Maintain one instance of HttpClient for all users.
> >>>
> >>> Support multiple users by getting the HttpState and storing Cookies
> >>> to each user's session.
> >>>
> >>> So ... for each session, first thing to do is get the cookies from
> >>> the session if there are cookies there, clear any existing cookies
> >>> from the HttpState, set the cookies from the session to the
> >>> HttpState, execute the get or post, retrieve the cookies from the
> >>> HttpState and set them again in the user session.
> >>>
> >>> Is this the correct way to go about doing what I want to do?
> >>>
> >>> Keith
> >>>
> >>> On Aug 18, 2005, at 6:59 PM, Keith Campbell wrote:
> >>>
> >>>
> >>>
> >>>> Hi all,
> >>>>
> >>>> A quick question for the list please. I've been struggling with
> >>>> this for a couple of days now w/o much success.
> >>>>
> >>>> I have a servlet which is used to send requests (using HttpClient)
> >>>> to another web application where:
> >>>>
> >>>> 1) each user must login -- each user logs in using GET by passing a
> >>>> user id as a parameter
> >>>> 2) each user's session must be persistent
> >>>> 3) multiple users will be using the application and each must
> >>>> maintain a unique session
> >>>>
> >>>> To do this, I've been trying to instantiate HttpClient, in my
> >>>> servlet, once per user session. And I'd like to be able to store/
> >>>> retrieve this instance in the user session. But HttpClient is not
> >>>> serializable ....
> >>>>
> >>>> How do I accomplish this functionality?
> >>>>
> >>>> Thanks in advance,
> >>>> Keith Campbell
> >>>>
> >>>> -------------------------------------------------------------------
> >>>> --
> >>>> To unsubscribe, e-mail: httpclient-user-
> >>>> unsubscribe@jakarta.apache.org
> >>>> For additional commands, e-mail: httpclient-user-
> >>>> help@jakarta.apache.org
> >>>>
> >>>>
> >>>>
> >>>>
> >>>
> >>>
> >>> --------------------------------------------------------------------
> >>> -
> >>> To unsubscribe, e-mail: httpclient-user-
> >>> unsubscribe@jakarta.apache.org
> >>> For additional commands, e-mail: httpclient-user-
> >>> help@jakarta.apache.org
> >>>
> >>> --------------------------------------------------------------------
> >>> -
> >>> To unsubscribe, e-mail: httpclient-user-
> >>> unsubscribe@jakarta.apache.org
> >>> For additional commands, e-mail: httpclient-user-
> >>> help@jakarta.apache.org
> >>>
> >>>
> >>>
> >>
> >>
> >> ---------------------------------------------------------------------
> >> To unsubscribe, e-mail: httpclient-user-
> >> unsubscribe@jakarta.apache.org
> >> For additional commands, e-mail: httpclient-user-
> >> help@jakarta.apache.org
> >>
> >>
> >>
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: httpclient-user-unsubscribe@jakarta.apache.org
> > For additional commands, e-mail: httpclient-user-
> > help@jakarta.apache.org
> >
> >
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: httpclient-user-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: httpclient-user-help@jakarta.apache.org
> 
>

---------------------------------------------------------------------
To unsubscribe, e-mail: httpclient-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: httpclient-user-help@jakarta.apache.org


Mime
View raw message