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系统中?
CookieSpec cookiespec = CookiePolicy.getDefaultSpec();
Cookie[] cookies = cookiespec.match(cookie_key, port, "/" , false , client.getState().getCookies());
具体的实现,你可以上网上查一下,
cookie_key 是你要用的cookie, port 是端口号,
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("提交成功!");
}
}
BufferedReader in = new BufferedReader(new InputStreamReader(method.getResponseBodyAsStream(),encode));
PrintWriter out = response.getWriter();
out.write(htmlvalue);
这里在页面中输出了之后,例如是一个系统链接,我在输出页面点这个链接,打开的页面会是回到登录页面。因为session根本就不存在
做 get 方式 访问 ( getMethod ) 就 哦 了