HttpClient client = new HttpClient(); client.getHostConfiguration().setHost( "localhost" , 7001, "http" ); /**
 * 模拟登陆门户系统
 */
PostMethod post = new PostMethod( "/wwt/login" );
NameValuePair name = new NameValuePair( "username" , "pengxl");
NameValuePair pass = new NameValuePair( "password" , "qqqq");
post.setRequestBody( new NameValuePair[]{name,pass});
client.executeMethod(post);

/**
 * 登录后的相关跳转
 */
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
int status = post.getStatusCode();
boolean flag = true;
if ((status == HttpStatus.SC_MOVED_TEMPORARILY) ||
            (status == HttpStatus.SC_MOVED_PERMANENTLY) ||
            (status == HttpStatus.SC_SEE_OTHER) ||
            (status == HttpStatus.SC_TEMPORARY_REDIRECT)){
flag = true;
}else{
flag = false;
}
GetMethod get = new GetMethod();
int i = 0;
while(flag){
i++;
System.out.println("第"+i+"步");
 Header header = post.getResponseHeader("location");
 if (header != null) {
 String newuri = header.getValue();
 if ((newuri == null) || (newuri.equals("")))
                                           newuri = "/";
 get=new GetMethod(newuri);
//  get.setRequestHeader("Cookie",cookies.toString()); 
 client.executeMethod(get);
//  cookies=client.getState().getCookies();
 status = get.getStatusCode();
 if ((status == HttpStatus.SC_MOVED_TEMPORARILY) ||
            (status == HttpStatus.SC_MOVED_PERMANENTLY) ||
            (status == HttpStatus.SC_SEE_OTHER) ||
            (status == HttpStatus.SC_TEMPORARY_REDIRECT)){
flag = true;
}else{
flag = false;
}
         } 
}
HttpParams httpParams = client.getParams();

String htmlvalue = new String(get.getResponseBodyAsString());
PrintWriter out = response.getWriter();
        out.write(htmlvalue);
上面方法实现了A系统对B系统的登录,并且把登录后最终的页面输出到了A系统中,
现在存在一个问题,输出后的页面 session中不存在B系统需要的session,因此无法对该页面进一步操作,请教如何把HttpClient中的session内容取出并放到A系统中?

解决方案 »

  1.   

    下次请求时把前面请求获得的cookie再发回去就行了。
      

  2.   

    登录成功后,HttpClient会保存cookie,
     CookieSpec cookiespec = CookiePolicy.getDefaultSpec();
     Cookie[] cookies = cookiespec.match(cookie_key, port, "/" , false , client.getState().getCookies());
    具体的实现,你可以上网上查一下,
    cookie_key 是你要用的cookie, port 是端口号,
      

  3.   


    public static void main(String[] args) {
    HttpClient client = new HttpClient();
    NameValuePair[] nameValuePairs = {
    new NameValuePair("username", "aaa"),
    new NameValuePair("passwd", "123456")
    };
    PostMethod postMethod = new PostMethod("登录url");
    postMethod.setRequestBody(nameValuePairs);
    int stats = 0;
    try {
    stats = client.executeMethod(postMethod);
    } catch (HttpException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    }
    postMethod.releaseConnection();//这里最好把之前的资源放掉
    CookieSpec cookiespec = CookiePolicy.getDefaultSpec();
    Cookie[] cookies = cookiespec.match("域名", 80/*端口*/, "/" , false , client.getState().getCookies());
    for (Cookie cookie : cookies) {
    System.out.println(cookie.getName() + "##" + cookie.getValue());
    }

    HttpMethod method = null;
    String encode = "utf-8";//页面编码,按访问页面改动
    String referer = "http://域名";//http://www.163.com
    method = new GetMethod("url2");//后续操作
    method.getParams().setParameter("http.useragent","Mozilla/4.0 (compatible; MSIE 5.5; Windows 98)");
    method.setRequestHeader("Referer", referer); client.getParams().setContentCharset(encode);
    client.getParams().setSoTimeout(300000);
    client.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(10, true));
      
    try {
    stats = client.executeMethod(method);
    } catch (HttpException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    }
    if (stats == HttpStatus.SC_OK) {
    System.out.println("提交成功!");

    }
    }
      

  4.   

    你可能理解错我意思了,httpClient本身就可以保持cookie,我需要的模拟结果出来后获取页面流信息,把页面流信息输出到页面上,并且把模拟过程中的session等这些东西都要赋值到servlet的输出中。
      

  5.   

    那你把数据用流打出来不就得了,
    BufferedReader in = new BufferedReader(new InputStreamReader(method.getResponseBodyAsStream(),encode));
      

  6.   

    String htmlvalue = new String(get.getResponseBodyAsString());
            PrintWriter out = response.getWriter();
            out.write(htmlvalue);
    这里在页面中输出了之后,例如是一个系统链接,我在输出页面点这个链接,打开的页面会是回到登录页面。因为session根本就不存在
      

  7.   

    其实lz的做法是应该实现系统B的proxy。在返回的页面,用户的浏览器应该是显示A系统的网址。所以没有可能直接去设置B系统的cookie。
      

  8.   

    用登陆时用的那个 HttpClient 对象,对你要访问的页面 
    做 get 方式 访问 ( getMethod ) 就 哦 了
      

  9.   

    请问一下,你这个问题解决了吗,我现在用httpclient的post登陆一个网站(UVA oj)之后也不能正确连接到redirect的页面,而是返回到用户登录页面.