做web开发的同学都知道,http是无状态的会话协议,也就是说无法保存用户的信息。那如果有一些信息需要在用户的浏览活动中一直保持,该怎么做呢?我 们可以把这些信息在每次请求的时候作为参数传递给服务器,但这样做既麻烦又耗费资源,这时候就体现出了session的重要性。session是web开 发中不可或缺的一个特性。它是对于一个特定的用户请求,在web服务器上保存的一个全局变量。有了它我们就可以把用户的一些信息保存在服务器上,而不用在 服务器和客户端之间来回传递。知道了session的作用,那session是怎么实现的呢?服务器上为每个用户都保存了一个session,那当用户请 求过来的时候是怎么知道某一个用户应该对应哪个session呢?这时jsessionid就派上用场了。每一个session都有一个id来作为标识, 这个id会传到客户端,每次客户端请求都会把这个id传到服务器,服务器根据id来匹配这次请求应该使用哪个session。
jsessionid就是客户端用来保存sessionid的变量,主要是针对j2ee实现的web容器,没有研究过其他语言是用什么变量来保存的。一般 对于web应用来说,客户端变量都会保存在cookie中,jsessionid也不例外。不过与一般的cookie变量不同,jsessionid是保 存在内存cookie中的,在一般的cookie文件中是看不到它的影子的。内存cookie在打开一个浏览器窗口的时候会创建,在关闭这个浏览器窗口的 时候也同时销毁。这也就解释了为什么session变量不能跨窗口使用,要跨窗口使用就需要手动把jsessionid保存到cookie里面。
在以上的文字中我们了解了session的实现原理,同时也知道了session跟jsessionid紧密不可分割的联系。只有通过jsessionid才能使session机制起作用,而jsessionid又是通过cookie来保存。
package testcase;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.commons.httpclient.Cookie;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpMethodBase;
import org.apache.commons.httpclient.methods.GetMethod;
public class TestCookie {
public static void main(String args[]) throws HttpException, IOException{
String username = "[email protected]";
String password = "123abc";
Map<String, String> cookieMap = new HashMap<String, String>();
cookieMap = new HashMap<String, String>();
String url = "http://caipiao.163.com/epayAccountInfo.html?cache=1399537161287";
GetMethod method = new GetMethod(url);
HttpClient client = new HttpClient();
client.executeMethod(method);
System.out.println(client.getState());
System.out.println(client.getState().getCookies());
Cookie[] cookies = client.getState().getCookies();
System.out.println(cookies);
System.out.println(cookies);
for (Cookie cookie : cookies) {
cookieMap.put(cookie.getName(), cookie.getValue());
System.out.println(cookie.getName());
System.out.println(cookie.getValue());
}
System.out.println("haha"+cookieMap);
String cookie = "";
for (Entry<String, String> entry : cookieMap.entrySet()) {
cookie += entry.getKey() + "=" + entry.getValue() + "; ";
}
System.out.println(cookie);
}
}
执行结果:
[ | | JSESSIONID=abcNxKRi0teFM67gPh1zu]
[Lorg.apache.commons.httpclient.Cookie;@470e2030
[Lorg.apache.commons.httpclient.Cookie;@3fb4f649
[Lorg.apache.commons.httpclient.Cookie;@3fb4f649
JSESSIONID
abcNxKRi0teFM67gPh1zu
haha{JSESSIONID=abcNxKRi0teFM67gPh1zu}
JSESSIONID=abcNxKRi0teFM67gPh1zu;