session一般保存在Cookie当中,首先我们了解一下session和cookie
引自:http://hi.baidu.com/cuihenrychl/item/a08e18268a01461577272ce4
Cookie和Session都为了用来保存状态信息,都是保存客户端状态的机制,它们都是为了解决HTTP无状态的问题而所做的努力。
Session可以用Cookie来实现,也可以用URL回写的机制来实现。
Cookie和Session有以下明显的不同点:
1)Cookie将状态保存在客户端,Session将状态保存在服务器端;
2)Cookies是服务器在本地机器上存储的小段文本并随每一个请求发送至同一个服务器。网络服务器用HTTP头向客户端发送cookies,在客户终端,浏览器解析这些cookies并将它们保存为一个本地文件,它会自动将同一服务器的任何请求缚上这些cookies。
3)Session是针对每一个用户的,变量的值保存在服务器上,用一个sessionID来区分是不同用户session变量,这个值是通过用户的浏览器在访问的时候返回给服务器,当客户禁用cookie时,这个值也可能设置为由get来返回给服务器;
4)就安全性来说:当你访问一个使用session 的站点,同时在自己机器上建立一个cookie,建议在服务器端的SESSION机制更安全些.因为它不会任意读取客户存储的信息。
Session机制
Session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。
当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为 session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个 session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个 session id将被在本次响应中返回给客户端保存。
Session的实现方式
1 ) 使用Cookie来实现
服务器给每个Session分配一个唯一的JSESSIONID,并通过Cookie发送给客户端。
当客户端发起新的请求的时候,将在Cookie头中携带这个JSESSIONID。这样服务器能够找到这个客户端对应的Session。
2 )使用URL回显来实现
URL回写是指服务器在发送给浏览器页面的所有链接中都携带JSESSIONID的参数,这样客户端点击任何一个链接都会把JSESSIONID带给服务器。
如果直接在浏览器中输入url来请求资源,Session是匹配不到的。
Tomcat对 Session的实现,是一开始同时使用Cookie和URL回写机制,如果发现客户端支持Cookie,就继续使用Cookie,停止使用URL回写。如果发现Cookie被禁用,就一直使用URL回写。jsp开发处理到Session的时候,对页面中的链接记得使用 response.encodeURL() 。
在项目中,我们一般使用HttpClient像如下这样来发起web请求:
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
HttpResponse httpResponse = httpClient.execute(httpPost);
这样当第一次请求完成之后就可以从httpClient中得到cookie
CookieStore cookieStore = httpClient.getCookieStore();
在cookieStore中会带有服务端生成的JSESSIONID
这样,我们可以生成一个全局的静态变量CookieStore,
在第一次请求成功之后,将返回的Cookie保存到这个全局的CookieStore中
完整代码如下:
public static CookieStore cookieStore;
DefaultHttpClient httpClient = new DefaultHttpClient();
httpClient.setCookieStore(cookieStore);
HttpPost httpPost = new HttpPost(url);
HttpResponse httpResponse = httpClient.execute(httpPost);
if (statusCode == HttpStatus.SC_OK) {
CookieStore cookieStore = httpClient.getCookieStore();
cookieStore = cookieStore;
}
这样就可以保证在每次Http请求是带上SESSIONID
在做项目时采用的是android原生+html的混合开发模式,登陆
采用的是android,因此在登陆之后,加载html页面是就要将Cookie放到
WebView中,
采用的方式如下,
if (null != NetUtil.cookieStore) {
CookieSyncManager.createInstance(getApplicationContext());
cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
cookieManager.removeSessionCookie();
}
// 在removeSessionCookie()之后要Sleep一段时间,cookie才能set进去,不知道为什么
SystemClock.sleep(100);
//然后将Cookie存放的CokieManager中
if (null != NetUtil.cookieStore) {
List<Cookie> cookies = CRMRemoteHandler.cookieStore
.getCookies();
for (int i = 0; i < cookies.size(); i++) {
Cookie cookie = cookies.get(i);
String cookieString = cookie.getName() + "="
+ cookie.getValue() + "; domain="
+ cookie.getDomain();
System.out.println(cookieString);
cookieManager.setCookie(cookie.getDomain(), cookieString);
}
CookieSyncManager.getInstance().sync();
}