热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

HttpClient模拟登录后如何保持session

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 个解决方案

#1


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

#2


下次请求是在A系统的页面中了,而不是在后续代码中再次请求

#3


登录成功后,HttpClient会保存COOKIE,
 COOKIESpec COOKIEspec = COOKIEPolicy.getDefaultSpec();
 COOKIE[] COOKIEs = COOKIEspec.match(COOKIE_key, port, "/" , false , client.getState().getCOOKIEs());
具体的实现,你可以上网上查一下,
COOKIE_key 是你要用的COOKIE, port 是端口号,

#4



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

}
}

#5


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

#6


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

#7


引用 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 = …


up

#8


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

#9


up

#10


求助啊

#11


你应该在服务页面添加输出流,在请求页面添加输入流

#12


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

#13


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

#14


我也遇到同样的问题。。。。。

#15


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

推荐阅读
author-avatar
心碎的醉鬼
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有