cookie与session的关系

cookie与session的关系

为什么会有cookie呢,大家都知道, http是无状态的协议 ,客户每次读取web页面时,服务器都打开新的会话,而且服务器也不会自动维护客户的上下文信息,那么要怎么才能实现网上商店中的购物车呢, session就是一种保存上下文信息的机制 ,它是针对每一个用户的,变量的值保存在服务器端,通过 SessionID来区分不同的客户,session是以cookie或URL重写为基础的,默认使用cookie来实现,系统会创造一个名为 JSESSIONID的输出cookie,我们叫做session cookie,以区别persistent cookies,也就是我们通常所说的cookie,注意session cookie是存储于浏览器内存中的,并不是写到硬盘上的,这也就是我们刚才看到的JSESSIONID,我们通常情是看不到JSESSIONID的,但是当我们把浏览器的cookie禁止后,web服务器会采用URL重写的方式传递Sessionid,我们就可以在地址栏看到 sessionid=KWJHUG6JJM65HS2K6之类的字符串。 
        明白了原理,我们就可以很容易的分辨出persistent cookies和session cookie的区别了,网上那些关于两者安全性的讨论也就一目了然了,session cookie针对某一次会话而言,会话结束session cookie也就随着消失了,而persistent cookie只是存在于客户端硬盘上的一段文本(通常是加密的),而且可能会遭到cookie欺骗以及针对cookie的跨站脚本攻击,自然不如 session cookie安全了。 
        通常session cookie是不能跨窗口使用的,当你新开了一个浏览器窗口进入相同页面时,系统会赋予你一个新的sessionid,这样我们信息共享的目的就达不到了,此时我们可以先把sessionid保存在persistent cookie中,然后在新窗口中读出来,就可以得到上一个窗口SessionID了,这样通过session cookie和persistent cookie的结合我们就实现了跨窗口的session tracking(会话跟踪)。 
        在一些web开发的书中,往往只是简单的把Session和cookie作为两种并列的http传送信息的方式,session cookies位于服务器端,persistent cookie位于客户端,可是session又是以cookie为基础的,明白的两者之间的联系和 
区别,我们就不难选择合适的技术来开发web service了 
cookie 
Session是由应用服务器维持的一个服务器端的存储空间,用户在连接服务器时,会由服务器生成一个唯一的SessionID,用该SessionID 为标识符来存取服务器端的Session存储空间。而SessionID这一数据则是保存到客户端,用Cookie保存的,用户提交页面时,会将这一 SessionID提交到服务器端,来存取Session数据。这一过程,是不用开发人员干预的。所以一旦客户端禁用Cookie,那么Session也会失效。 

服务器也可以通过URL重写的方式来传递SessionID的值,因此不是完全依赖Cookie。如果客户端Cookie禁用,则服务器可以自动通过重写URL的方式来保存Session的值,并且这个过程对程序员透明。 

可以试一下,即使不写Cookie,在使用request.getCookies();取出的Cookie数组的长度也是1,而这个Cookie的名字就是JSESSIONID,还有一个很长的二进制的字符串,是SessionID的值。 
Cookie是客户端的存储空间,由浏览器来维持。
 
总结:
1:cookie是通过头部header返回到浏览器中并保存在磁盘中,下次再次访问该服务器中。浏览器会自动把该cookie传输到服务器中。
2:Session与Cookie是一对的,Session使用的基础就是cookie。
3:cookie分为两种,如果设置cookie时没有设置有效时间,就表示该cookie是临时性的,只保存在浏览器的内存中,即seesion-cookie,只要关闭浏览器,该cookie即将消失。
                          如果cookie设置了有效时间,就表示该cookie是持久化的,即 persistent cookie。此外还可以为持久化cookie设置域名和路径。
4:当禁止cookie后,就返回通过url地址返回cookie Id。
5:如来是否自定义cookie值,服务器都会自动产生一个cookie值,名称为:
JSESSIONID,而值就是服务器中的sessionid值。

创建cookie的步骤: 以java为例:
 1: 创建cookie对象: Cookie cookie = new  Cookie( "cookiename" , "cookievalue" ); 
 2:设置有效期: cookie.setMaxAge( 3600 ); 
 3:设置路径: cookie.setPath( "/" );  //设置路径,这个路径即该工程下都可以访问该cookie 如果不设置路径,那么只有设置该cookie路径及其子路径可以访问 
 4:设置域名: cookie .setDomain( ".zl.org" ) ;   // 域名要以 “.” 开头 
 5:在返回对象中添加cookie对象: response.addCookie( cookie ) ; 
 6:返回对象 response其他的操作。

以下为Java操作Cookie实例:
java对cookie的操作比较简单,主要介绍下建立cookie和读取cookie,以及如何设定cookie的生命周期和cookie的路径问题。

建立一个无生命周期的cookie,即随着浏览器的关闭即消失的cookie,代码如下

HttpServletRequest request  
HttpServletResponse response
Cookie cookie =  new Cookie("cookiename","cookievalue");
response.addCookie(cookie);
 
下面建立一个有生命周期的cookie,可以设置他的生命周期

cookie =  new Cookie("cookiename","cookievalue");
 
cookie.setMaxAge(3600);
 
// 设置路径,这个路径即该工程下都可以访问该cookie 如果不设置路径,那么只有设置该cookie路径及其子路径可以访问
 
cookie.setPath("/");
response.addCookie(cookie);
 

下面介绍如何读取cookie,读取cookie代码如下

Cookie[] cookies = request.getCookies(); // 这样便可以获取一个cookie数组
for(Cookie cookie : cookies){
    cookie.getName(); //  get the cookie name
    cookie.getValue();  //  get the cookie value
}
 

上面就是基本的读写cookie的操作。我们在实际中最好进行一下封装,比如增加一个cookie,我们关注的是cookie的name,value,生命周期,所以进行封装一个函数,当然还要传入一个response对象,addCookie()代码如下

/**
 * 设置cookie
 * 
@param  response
 * 
@param  name  cookie名字
 * 
@param  value cookie值
 * 
@param  maxAge cookie生命周期  以秒为单位
 
*/
public  static  void addCookie(HttpServletResponse response,String name,String value, int maxAge){
    Cookie cookie =  new Cookie(name,value);
    cookie.setPath("/");
     if(maxAge>0)  cookie.setMaxAge(maxAge);
    response.addCookie(cookie);
}
 

读取cookie的时候,为了方便我们的操作,我们希望封装一个函数,只要我们提供cookie的name,我们便可以获取cookie的value,带着这个想法,很容易想到将cookie封装到Map里面,于是进行下面的封装.
/**
 * 根据名字获取cookie
 * 
@param  request
 * 
@param  name cookie名字
 * 
@return
 
*/
public  static Cookie getCookieByName(HttpServletRequest request,String name){
    Map<String,Cookie> cookieMap = ReadCookieMap(request);
     if(cookieMap.containsKey(name)){
        Cookie cookie = (Cookie)cookieMap.get(name);
         return cookie;
    } else{
         return  null;
    }   
}
  
/**
 * 将cookie封装到Map里面
 * 
@param  request
 * 
@return
 
*/
private  static Map<String,Cookie> ReadCookieMap(HttpServletRequest request){  
    Map<String,Cookie> cookieMap =  new HashMap<String,Cookie>();
    Cookie[] cookies = request.getCookies();
     if( null!=cookies){
         for(Cookie cookie : cookies){
            cookieMap.put(cookie.getName(), cookie);
        }
    }
     return cookieMap;
}

你可能感兴趣的:(cookie与session的关系)