JAVA模拟浏览器怎么保留住成功登录的对话信息,可以继续访问其二级页面

jojo_0214 2012-02-13 02:55:49
小的近日,在用java中httpclient模拟网页登陆时,碰上问题:
private static String userName = "×××××";
private static String password = "×××××";

private static String redirectURL = "http://www.×××.com/home";//没有用 使用getFirstHeader()从服务器取的

// Don't change the following URL
private static String renRenLoginURL = "http://www.×××.com/PLogin.do";

// The HttpClient is used in one session
private HttpResponse response;//用途
private DefaultHttpClient httpclient = new DefaultHttpClient();//一直使用的客户端
private boolean login() {
HttpPost httpost = new HttpPost(renRenLoginURL);
// All the parameters post to the web site
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
nvps.add(new BasicNameValuePair("origURL", redirectURL));
nvps.add(new BasicNameValuePair("domain", "renren.com"));
nvps.add(new BasicNameValuePair("isplogin", "true"));
nvps.add(new BasicNameValuePair("formName", ""));
nvps.add(new BasicNameValuePair("method", ""));
nvps.add(new BasicNameValuePair("submit", "登录"));

nvps.add(new BasicNameValuePair("email", userName));
nvps.add(new BasicNameValuePair("password", password));
try {
httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
response = httpclient.execute(httpost);//执行登录请求 返回信息
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
httpost.abort();//不废除会报错
}
return true;
}
这是登录代码,可以成功登录,但是在登录成功的基础上再访问该网页下的二级页面,就又失败了,小的想知道,如何才能保留住成功登陆的会话session信息,使得再请求该网站上的其他页面时为登陆状态,即通过验证的状态。
...全文
411 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
MiceRice 2012-02-15
  • 打赏
  • 举报
回复
原来是淫淫网,这个网站与其各子应用之间都是以单点登录方式进行整合的,而且也对这种工具自动登录的做了防范处理,如果要想直接用HttpClient进行跳转的话,要解决很多JS后期加载的参数问题,客观地说复杂度还是比较高的。
jojo_0214 2012-02-15
  • 打赏
  • 举报
回复
代码过程即先登录人人主页 然后打印出个人主页源代码,然后到自己指定的一个好友页面,利用htmlparser包对该页面html文本爬取下来;但是实际效果是能打印出个人主页源代码,但一执行到进入指定好友页面,并爬取该页面,就爬不下来,爬下来的只是人人登录时(未登录)的人人首页。在网上查到要先保存cookie,不知道是不是这里出了问题。

public class Visit {
private static String userName = "123456678@123.com";
private static String password = "123456";
private static String redirectURL = "http://www.renren.com/home";//没有用 使用getFirstHeader()从服务器取的
// Don't change the following URL
private static String renRenLoginURL = "http://www.renren.com/PLogin.do";

// The HttpClient is used in one session
private HttpResponse response;//用途
public DefaultHttpClient httpclient = new DefaultHttpClient();//一直使用的客户端
// public HttpClient httpclient = new HttpClient();
private boolean login() {
HttpPost httpost = new HttpPost(renRenLoginURL);
// All the parameters post to the web site
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
nvps.add(new BasicNameValuePair("origURL", redirectURL));
nvps.add(new BasicNameValuePair("domain", "renren.com"));
nvps.add(new BasicNameValuePair("isplogin", "true"));
nvps.add(new BasicNameValuePair("formName", ""));
nvps.add(new BasicNameValuePair("method", ""));
nvps.add(new BasicNameValuePair("submit", "登录"));

nvps.add(new BasicNameValuePair("email", userName));
nvps.add(new BasicNameValuePair("password", password));
try {
httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
response = httpclient.execute(httpost);//执行登录请求 返回信息
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
httpost.abort();//不废除会报错
}
return true;
}
public String getRedirectLocation() {
blablabla~~略去中间代码
}
public String getText(String redirectLocation) {
blablabla~~略去中间代码
}
public void printText() {
if (login()) {
String redirectLocation = getRedirectLocation();
if (redirectLocation != null) {
System.out.println(getText(redirectLocation));
}

}
}
private static String ENCODE = "gb2312";
private static void message(String szMsg) {
try{
System.out.println(new String(szMsg.getBytes(ENCODE), System.getProperty("file.encoding")));
}
catch(Exception e ){}
}
public void parse(int id){
Parser parser = new Parser("http://www.renren.com/" + id);

for (NodeIterator i = parser.elements(); i.hasMoreNodes(); ) {
Node node = i.nextNode();
message("getText:"+node.getText());
message("getPlainText:"+node.toPlainTextString());
message("toHtml:"+node.toHtml());
message("toHtml(true):"+node.toHtml(true));
message("toHtml(false):"+node.toHtml(false));
message("toString:"+node.toString());
message("=================================================");
}
}
catch( Exception e ) {
System.out.println( "Exception:"+e );
}
}
public static void main(String[] args) throws InterruptedException {
Visit lw = new Visit();
lw.printText();
lw.parse(987654321);
}
}[Quote=引用 9 楼 ldh911 的回复:]

用过HttpClient做WebGame的刷刷器啥的,没出现过你的情况。建议你用HttpWatcher对IE的所有来往参数进行详细检查,一般情况下都是漏了某些关键性参数,这些参数往往都稍微复杂,甚至是JS拼装而成,就是为了防止自动脚本工具。

或者贴出精简后的完整代码,看看有木有好心人帮你测试测试。
[/Quote]
MiceRice 2012-02-15
  • 打赏
  • 举报
回复
用过HttpClient做WebGame的刷刷器啥的,没出现过你的情况。建议你用HttpWatcher对IE的所有来往参数进行详细检查,一般情况下都是漏了某些关键性参数,这些参数往往都稍微复杂,甚至是JS拼装而成,就是为了防止自动脚本工具。

或者贴出精简后的完整代码,看看有木有好心人帮你测试测试。
jojo_0214 2012-02-14
  • 打赏
  • 举报
回复
我把登录以后的页面按流方式在终端显示了出来~[Quote=引用 7 楼 chenyefeng 的回复:]

你怎么知道你登录成功了啊,建议你用firebug看一下,这个登录网页具体传了哪些参数,然后再在debug环境下,查看有没有真正登录到对应的网站.
[/Quote]
Daniel-C 2012-02-14
  • 打赏
  • 举报
回复
你怎么知道你登录成功了啊,建议你用firebug看一下,这个登录网页具体传了哪些参数,然后再在debug环境下,查看有没有真正登录到对应的网站.
jojo_0214 2012-02-14
  • 打赏
  • 举报
回复
还是不行,直接在该含该httpclient 的函数中紧接着对 二级页面进行httpparser,可是爬取下来的还是未登录信息~[Quote=引用 1 楼 ldh911 的回复:]

HttpClient是支持模拟Cookie管理的,只要你别新new一个HttpClient,而是继续沿用那个已经登录成功的HttpClient就行。
[/Quote]
ldhbq2014 2012-02-14
  • 打赏
  • 举报
回复
1 楼 是 对的
dyc_cs_dn 2012-02-14
  • 打赏
  • 举报
回复
这里在servlet中我用request对象 怎么没有接受到数据呢?
有能给个demo 的吗? servlet 接受传递过来的数据
MiceRice 2012-02-13
  • 打赏
  • 举报
回复
HttpClient是支持模拟Cookie管理的,只要你别新new一个HttpClient,而是继续沿用那个已经登录成功的HttpClient就行。

81,092

社区成员

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

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