- Java code
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系统中?
------解决方案--------------------
下次请求时把前面请求获得的cookie再发回去就行了。
------解决方案--------------------
登录成功后,HttpClient会保存cookie,
CookieSpec cookiespec = CookiePolicy.getDefaultSpec();
Cookie[] cookies = cookiespec.match(cookie_key, port, "/" , false , client.getState().getCookies());
具体的实现,你可以上网上查一下,
cookie_key 是你要用的cookie, port 是端口号,
------解决方案--------------------
- Java code
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("提交成功!"); } }