作者:心碎的醉鬼 | 来源:互联网 | 2023-05-19 03:31
HttpClientclientnewHttpClient();client.getHostConfiguration().setHost(localhost,7001,h
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系统中?
15 个解决方案
下次请求时把前面请求获得的COOKIE再发回去就行了。
下次请求是在A系统的页面中了,而不是在后续代码中再次请求
登录成功后,HttpClient会保存COOKIE,
COOKIESpec COOKIEspec = COOKIEPolicy.getDefaultSpec();
COOKIE[] COOKIEs = COOKIEspec.match(COOKIE_key, port, "/" , false , client.getState().getCOOKIEs());
具体的实现,你可以上网上查一下,
COOKIE_key 是你要用的COOKIE, port 是端口号,
你可能理解错我意思了,httpClient本身就可以保持COOKIE,我需要的模拟结果出来后获取页面流信息,把页面流信息输出到页面上,并且把模拟过程中的session等这些东西都要赋值到servlet的输出中。
那你把数据用流打出来不就得了,
BufferedReader in = new BufferedReader(new InputStreamReader(method.getResponseBodyAsStream(),encode));
String htmlvalue = new String(get.getResponseBodyAsString());
PrintWriter out = response.getWriter();
out.write(htmlvalue);
这里在页面中输出了之后,例如是一个系统链接,我在输出页面点这个链接,打开的页面会是回到登录页面。因为session根本就不存在
其实lz的做法是应该实现系统B的proxy。在返回的页面,用户的浏览器应该是显示A系统的网址。所以没有可能直接去设置B系统的COOKIE。
用登陆时用的那个 HttpClient 对象,对你要访问的页面
做 get 方式 访问 ( getMethod ) 就 哦 了
请问一下,你这个问题解决了吗,我现在用httpclient的post登陆一个网站(UVA oj)之后也不能正确连接到redirect的页面,而是返回到用户登录页面.