HttpClient 模拟登录后如何保持session

languo 2009-07-14 03:16:50

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系统中?
...全文
9825 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Daniel-C 2011-09-29
  • 打赏
  • 举报
回复
请问一下,你这个问题解决了吗,我现在用httpclient的post登陆一个网站(UVA oj)之后也不能正确连接到redirect的页面,而是返回到用户登录页面.
taotaoyong 2010-03-29
  • 打赏
  • 举报
回复
我也遇到同样的问题。。。。。
worm-wei 2009-11-27
  • 打赏
  • 举报
回复
用登陆时用的那个 HttpClient 对象,对你要访问的页面
做 get 方式 访问 ( getMethod ) 就 哦 了
languo 2009-07-20
  • 打赏
  • 举报
回复
up
平淡面对 2009-07-20
  • 打赏
  • 举报
回复
其实lz的做法是应该实现系统B的proxy。在返回的页面,用户的浏览器应该是显示A系统的网址。所以没有可能直接去设置B系统的cookie。
rascalboy520 2009-07-20
  • 打赏
  • 举报
回复
你应该在服务页面添加输出流,在请求页面添加输入流
languo 2009-07-20
  • 打赏
  • 举报
回复
求助啊
rascalboy520 2009-07-17
  • 打赏
  • 举报
回复
那你把数据用流打出来不就得了,
BufferedReader in = new BufferedReader(new InputStreamReader(method.getResponseBodyAsStream(),encode));
languo 2009-07-17
  • 打赏
  • 举报
回复
你可能理解错我意思了,httpClient本身就可以保持cookie,我需要的模拟结果出来后获取页面流信息,把页面流信息输出到页面上,并且把模拟过程中的session等这些东西都要赋值到servlet的输出中。
languo 2009-07-17
  • 打赏
  • 举报
回复
String htmlvalue = new String(get.getResponseBodyAsString());
PrintWriter out = response.getWriter();
out.write(htmlvalue);
这里在页面中输出了之后,例如是一个系统链接,我在输出页面点这个链接,打开的页面会是回到登录页面。因为session根本就不存在
meander 2009-07-17
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 rascalboy520 的回复:]
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 = …
[/Quote]

up
rascalboy520 2009-07-15
  • 打赏
  • 举报
回复

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("提交成功!");

}
}
rascalboy520 2009-07-15
  • 打赏
  • 举报
回复
登录成功后,HttpClient会保存cookie,
CookieSpec cookiespec = CookiePolicy.getDefaultSpec();
Cookie[] cookies = cookiespec.match(cookie_key, port, "/" , false , client.getState().getCookies());
具体的实现,你可以上网上查一下,
cookie_key 是你要用的cookie, port 是端口号,
languo 2009-07-14
  • 打赏
  • 举报
回复
下次请求是在A系统的页面中了,而不是在后续代码中再次请求
rumlee 2009-07-14
  • 打赏
  • 举报
回复
下次请求时把前面请求获得的cookie再发回去就行了。

62,633

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧