为什么我的这段代码获取不到sessionId的值呢

zhouzhijun 2008-09-29 11:36:36
package com.main;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class Test {

public static void main(String[] args) {
try {
URL url=new URL("http://www.taobao.com");
HttpURLConnection huc = (HttpURLConnection) url.openConnection();
huc.connect();
InputStream is = huc.getInputStream();
// 取得sessionID.
String cookieVal = huc.getHeaderField("Set-Cookie");
String sessionId="";
if (cookieVal != null) {
sessionId = cookieVal.substring(0, cookieVal.indexOf(";"));
}

System.out.println(sessionId);

} catch (Exception e) {
e.printStackTrace();
}
}
}
...全文
803 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
boxiuzhen 2011-02-14
  • 打赏
  • 举报
回复
我是来界分的
zhouzhijun 2008-09-30
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 sagezk 的回复:]
给你一段登录和讯博客的:


Java codeimport java.io.IOException;
import org.apache.commons.httpclient.Cookie;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.cookie.CookiePolicy;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apa…
[/Quote]

我看来了,是通过四次执行method来执行一个登录操作,但我对这四次具体做了些什么不是很了解

能够给我解释一下呢

还有,我听说现在httpclient被合并到httpcomponents里了,而且httpclient部分做了很大改动,不知道你用的是以前的版本还是现在的新版本?
zhouzhijun 2008-09-30
  • 打赏
  • 举报
回复
其实我要做的事情很简单,模拟浏览器做登录操作和进一步的操作:

大家都知道一个会话(session)期间包含了n个请求和回复(request 和 response)

为了识别每次请求是否来自同一个用户,采用了cookie技术,禁用cookie的时候采用url重写技术,这里,暂不考虑url重写技术

现在来谈谈cookie,我现在的认识是(可能是错误的,希望指正):
当你第一次访问某网站主页的时候(比如http://www.baidu.com),这个时候就会在cookie中有一个特殊的值是用来指示是否
是同一个用户的,然后整个session期间就一直沿用这个特殊值.从Enter Url到此刻为止,就产生了这么一个特殊值sessionId(题外话,过去
的我一直以为,只有登录了网站,输入用户名密码之后才会有这个特殊值).

我现在需要在登录网站(登录网站为第一步操作)之后,做第二步的操作,也就是说,第二步的操作需要至少三个值:
1.用户名
2.密码
3.特殊值sessionId(万事具备,只欠id)

我现在就是不知道如何去获取这个id

但我现在知道,当我去访问百度主页http://www.baidu.com的时候,他就会给我一个sessionId
我可以知道某时某刻我访问百度主页的时候的sessionId,可是这是用别人的软件获取的,无法在我自己的java程序里获取.

也许是我一开始没讲清楚,但这个才是我的问题所在.
boxiuzhen 2008-09-30
  • 打赏
  • 举报
回复
我最近也碰到了类似的问题
zhouzhijun 2008-09-29
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 sagezk 的回复:]
输出:


Java code

null
HTTP/1.1 200 OK
Content-Language
cn
Date
Mon, 29 Sep 2008 03:58:04 GMT
Vary
Accept-Encoding
Transfer-Encoding
chunked
Expires
Mon, 29 Sep 2008 04:58:04 GMT
Keep-Alive
timeout=15, max=60
Connection
Keep-Alive
Content-Type
text/html; charset=GB2312
Server
Apache
Cache-Control
max-age=3600




没有 …
[/Quote]

我自己研究了下,有requestHeader和responseHeader之分
我用监控软件监控了下

(Request-Line)这是请求,有cookie:
GET / HTTP/1.1
Accept:*/*
Accept-Language:en,zh-cn;q=0.5
Accept-Encoding:gzip, deflate
User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 1.1.4322; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; MAXTHON 2.0)
Host:www.baidu.com
Connection:Keep-Alive
Cookie:BAIDUID=1DDAA25773ADF9582C8A3545B6BAC8DC:FG=1; BDSTAT=b9b227957c2770a776c6a7efce1b9d16fdfaaf51f5deb48f8c5494eef11f465d; BD_UTK_DVT=1; BDSP=1c720bb01a4c510f047071d36059252dd42a2834349b033b5bb5c9ea15ce36d3d539b6003af33a87e950352ac65c10385343fbf2b2119313b07eca8065380cd7912397dda144ad345982b2b7d0a20cf431adcbef76094b36acaf2edda3cc7cd98f10e44e

(Status-Line)这是response,一般不会有cookie:
HTTP/1.1 200 OK
Date:Mon, 29 Sep 2008 04:56:26 GMT
Server:BWS/1.0
Content-Length:1714
Content-Type:text/html
Cache-Control:private
Expires:Mon, 29 Sep 2008 04:56:26 GMT
Content-Encoding:gzip


因为上面的代码只是看了response的header,所以为空,但是如何去获取request的header呢?
我虽然用了下面的代码,但是还是打印不出信息来.


package com.main;

import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class Test {

public static void main(String[] args) {
try {
URL url = new URL("http://www.google.com");
HttpURLConnection huc = (HttpURLConnection) url.openConnection();

// //////////////////////////////////////////////////////////////////////////
Map<String, List<String>> map = huc.getRequestProperties();
Set<String> keys = map.keySet();
for (String key : keys) {
System.out.println(key);
List<String> values = map.get(key);
for (String value : values) {
System.out.println("\t" + value);
}
}
// //////////////////////////////////////////////////////////////////////////
} catch (Exception e) {
e.printStackTrace();
}
}
}
sagezk 2008-09-29
  • 打赏
  • 举报
回复
输出:



null
HTTP/1.1 200 OK
Content-Language
cn
Date
Mon, 29 Sep 2008 03:58:04 GMT
Vary
Accept-Encoding
Transfer-Encoding
chunked
Expires
Mon, 29 Sep 2008 04:58:04 GMT
Keep-Alive
timeout=15, max=60
Connection
Keep-Alive
Content-Type
text/html; charset=GB2312
Server
Apache
Cache-Control
max-age=3600


没有 Set-Cookie 响应头。
sagezk 2008-09-29
  • 打赏
  • 举报
回复
//import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class Test {

public static void main(String[] args) {
try {
URL url = new URL("http://www.taobao.com");
HttpURLConnection huc = (HttpURLConnection)url.openConnection();
huc.connect();
//InputStream is = huc.getInputStream();
//取得sessionID
String cookieVal = huc.getHeaderField("Set-Cookie");
String sessionId = "";
if (cookieVal != null) {
sessionId = cookieVal.substring(0, cookieVal.indexOf(";"));
}
System.out.println(sessionId);
////////////////////////////////////////////////////////////////////////////
Map<String, List<String>> map = huc.getHeaderFields();
Set<String> keys = map.keySet();
for (String key : keys) {
System.out.println(key);
List<String> values = map.get(key);
for (String value : values) {
System.out.println("\t" + value);
}
}
////////////////////////////////////////////////////////////////////////////
} catch (Exception e) {
e.printStackTrace();
}
}

}
yemanet 2008-09-29
  • 打赏
  • 举报
回复
学习。
lihan6415151528 2008-09-29
  • 打赏
  • 举报
回复
哈哈 紫竹兄
老紫竹 2008-09-29
  • 打赏
  • 举报
回复
cookie 不止一个,
所以你应该循环判断才行
lihan6415151528 2008-09-29
  • 打赏
  • 举报
回复
huc.getHeaderField("Set-Cookie");

看看这个方法用法就知道了
zhouzhijun 2008-09-29
  • 打赏
  • 举报
回复
String cookieVal = huc.getHeaderField("Set-Cookie");
执行后cookieVal为空,问题就是这里
可能是URL url=new URL("http://www.taobao.com"); 难道是请求的地址返回不了cookie?
zhouzhijun 2008-09-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lihan6415151528 的回复:]
Java codeif (cookieVal != null) {
sessionId = cookieVal.substring(0, cookieVal.indexOf(";"));
}



看看这句执行了没 打印测试下


没执行的话就是没有取到cookieVal cookieVal =null
[/Quote]
我看过的,没有执行,问题是怎么样才能让他不是null呢
lihan6415151528 2008-09-29
  • 打赏
  • 举报
回复
if (cookieVal != null) { 
sessionId = cookieVal.substring(0, cookieVal.indexOf(";"));
}


看看这句执行了没 打印测试下


没执行的话就是没有取到cookieVal cookieVal =null
sagezk 2008-09-29
  • 打赏
  • 举报
回复
给你一段登录和讯博客的:

import java.io.IOException;
import org.apache.commons.httpclient.Cookie;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.cookie.CookiePolicy;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.params.HttpClientParams;


public class Main {

public static final String USER_AGENT = "Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-CN; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1";

public static void main(String[] args) {
String username = "YourUsername";
String password = "YourPassword";
try {
HttpClient hc = new HttpClient();
hc.getParams().setParameter(HttpClientParams.USER_AGENT, USER_AGENT);
hc.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);
////////////////////////////////////////////////////////////////////////////
GetMethod hm1 = new GetMethod("http://reg.hexun.com/login.aspx");
hc.executeMethod(hm1);
hm1.releaseConnection();
if (hm1.getStatusCode() != HttpStatus.SC_OK) return;
////////////////////////////////////////////////////////////////////////////
PostMethod hm2 = new PostMethod("http://reg.hexun.com/login.aspx");
hm2.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
hm2.addParameter("TextBoxUserName", username);
hm2.addParameter("TextBoxPassword", password);
hm2.addParameter("TextGpic", "");
hm2.addParameter("hiddenReferrer", "http://blog.hexun.com/");
hm2.addParameter("gourl", "");
hm2.addParameter("LoginStateName", "1");
hm2.addParameter("submitsign", "1");
hm2.addParameter("x", "32");
hm2.addParameter("y", "9");
hc.executeMethod(hm2);
hm2.releaseConnection();
if (hm2.getStatusCode() != HttpStatus.SC_MOVED_TEMPORARILY) return;
////////////////////////////////////////////////////////////////////////////
String rdurl = hm2.getResponseHeader("Location").getValue();
StringBuilder sb = new StringBuilder();
String tck = null;
Cookie[] cks = hc.getState().getCookies();
for (Cookie ck : cks) {
if ("ASP.NET_SessionId".equalsIgnoreCase(ck.getName())) continue;
if ("hxck_sq_common".equalsIgnoreCase(ck.getName())) tck = ck.getValue();
if (sb.length() > 0) sb.append("; ");
sb.append(ck.getName());
sb.append("=");
sb.append(ck.getValue());
}
hc.getState().clearCookies();
////////////////////////////////////////////////////////////////////////////
GetMethod hm3 = new GetMethod(rdurl);
hm3.setFollowRedirects(false);
hm3.addRequestHeader("Referer", "http://reg.hexun.com/login.aspx");
hm3.addRequestHeader("Cookie", sb.toString());
hc.executeMethod(hm3);
hm3.releaseConnection();
if (hm3.getStatusCode() != HttpStatus.SC_MOVED_PERMANENTLY) return;
////////////////////////////////////////////////////////////////////////////
rdurl = hm3.getResponseHeader("Location").getValue();
sb.setLength(0);
cks = hc.getState().getCookies();
for (Cookie ck : cks) {
if ("ASP.NET_SessionId".equalsIgnoreCase(ck.getName())) continue;
if (sb.length() > 0) sb.append("; ");
sb.append(ck.getName());
sb.append("=");
sb.append(ck.getValue());
}
if (sb.length() > 0) sb.append("; ");
sb.append("; hxck_sq_common=");
sb.append(tck);
hc.getState().clearCookies();
////////////////////////////////////////////////////////////////////////////
GetMethod hm4 = new GetMethod(rdurl);
hm4.setFollowRedirects(false);
hm4.addRequestHeader("Referer", "http://reg.hexun.com/login.aspx");
hm4.addRequestHeader("Cookie", sb.toString());
hc.executeMethod(hm4);
System.out.println(hm4.getResponseBodyAsString());
hm4.releaseConnection();
} catch (HttpException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

}
無名VF 2008-09-29
  • 打赏
  • 举报
回复
up
zx273064010 2008-09-29
  • 打赏
  • 举报
回复
学习
zhouzhijun 2008-09-29
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 sagezk 的回复:]
楼主用 HttpClient 吧,下载地址:http://hc.apache.org/downloads.cgi
[/Quote]
行,能不能给段代码,我下好HttpClient就可以直接用了
sagezk 2008-09-29
  • 打赏
  • 举报
回复
楼主用 HttpClient 吧,下载地址:http://hc.apache.org/downloads.cgi
C0150 2008-09-29
  • 打赏
  • 举报
回复
不懂,只能顶一个了,呵呵
加载更多回复(1)

62,614

社区成员

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

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