简述cookies 和 session

session

HTTP协议自己是无状态的,自己并不能支持服务端保存客户端的状态信息,因而,Web Server中引入了session的概念,用来保存客户端的状态信息。 数据库

1)当一个用户向服务器发送第一个请求时,服务器为其创建一个session,并为此session建立一个标识号;

2 ) 这个用户随后的全部请求都应包括这个标识号。服务器会校对这个标识号以判断请求属于哪一个session。跨域

这种机制不使用IP做为标识,是由于不少机器是经过代理服务器方式上网,无法区分每一台机器。数组

对于session标识号(sessionID),有两种方式实现:cookies和URL重写。浏览器

 

1)URL重写。 
Web Server在返回Response的时候,检查页面中全部的URL,包括全部的链接,和HTML Form的Action属性,在这些URL后面加上“;jsessionid=XXX”。 
下一次,用户访问这个页面中的URL。jsessionid就会传回到Web Server。安全

2)Cookie。 服务器

若是客户端支持Cookie,Web Server在返回Response的时候,在Response的Header部分,加入一个“set-cookie: jsessionid=XXXX”header属性,把jsessionid放在Cookie里传到客户端。 cookie

客户端会把Cookie存放在本地文件里,下一次访问Web Server的时候,再把Cookie的信息放到HTTP Request的“Cookie”header属性里面,这样jsessionid就随着HTTP Request返回给Web Server。网络

 

实际上大多数的应用都是用 Cookie 来实现Session跟踪的,cookies是实现session的一种方式,经过cookies,把sessionID发送给服务器,来实现session。session

 

cookies的主要内容

主要包括:名字,值,过时时间,路径和域。
路径、域和做用范围:其中域能够指定某一个域好比.google.com,至关于总店招牌,好比宝洁公司,也能够指定一个域下的具体某台机器好比www.google.com或者froogle.google.com,能够用飘柔来作比。
路径就是跟在域名后面的URL路径,好比/或者/foo等等,能够用某飘柔专柜作比。
路径与域合在一块儿就构成了cookie的做用范围。
过时时间:如 果不设置过时时间,则表示这个cookie的生命期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种 生命期为浏览器会话期的 cookie被称为会话cookie会话cookie通常不存储在硬盘上而是保存在内存里,固然这种行为并非规范规定的。若是设置了过时时间,浏览器 就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过时时间。
 
 

Cookie的缺陷数据结构

(1)cookie会被附加在每一个HTTP请求中,因此无形中增长了流量。

(2)因为在HTTP请求中的cookie是明文传递的,因此安全性成问题。(除非用HTTPS)

(3)Cookie的大小限制在4KB左右。对于复杂的存储需求来讲是不够用的。

 

Cookie的根本做用就是在客户端存储用户访问网站的一些信息。典型的应用有:

一、记住密码,下次自动登陆。

二、购物车功能。

三、记录用户浏览数据,进行商品(广告)推荐。

 
Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据能够保存在集群、数据库、文件中;
Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式
 
 
Cookie和Session的区别
 
 一、存放位置不一样
Cookie保存在客户端,Session保存在服务端。
 
2 、存取方式的不一样

Cookie中只能保管ASCII字符串,假如需求存取Unicode字符或者二进制数据,需求先进行编码。Cookie中也不能直接存取Java对象。若要存储略微复杂的信息,运用Cookie是比拟艰难的。 

而Session中可以存取任何类型的数据,包括而不限于String、Integer、List、Map等。Session中也可以直接保管Java Bean乃至任何Java类,对象等,运用起来十分便当。可以把Session看作是一个Java容器类。 

 

三、安全性(隐私策略)的不一样 

Cookie存储在浏览器中,对客户端是可见的,客户端的一些程序可能会窥探、复制以致修正Cookie中的内容。而Session存储在服务器上,对客户端是透明的,不存在敏感信息泄露的风险。 假如选用Cookie,比较好的方法是,敏感的信息如帐号密码等尽可能不要写到Cookie中。最好是像Google、Baidu那样将Cookie信息加密,提交到服务器后再进行解密,保证Cookie中的信息只要本人能读得懂。而假如选择Session就省事多了,反正是放在服务器上,Session里任何隐私都可以有效的保护。 

 

四、有效期上的不一样 

只须要设置Cookie的过时时间属性为一个很大很大的数字,Cookie就能够在浏览器保存很长时间。 因为Session依赖于名为JSESSIONID的Cookie,而Cookie JSESSIONID的过时时间默许为–1,只需关闭了浏览器(一次会话结束),该Session就会失效。

 

五、对服务器形成的压力不一样 

Session是保管在服务器端的,每一个用户都会产生一个Session。假如并发访问的用户十分多,会产生十分多的Session,耗费大量的内存。而Cookie保管在客户端,不占用服务器资源。假如并发阅读的用户十分多,Cookie是很好的选择。

 

六、 跨域支持上的不一样 

Cookie支持跨域名访问,例如将domain属性设置为“.baidu.com”,则以“.baidu.com”为后缀的一切域名均可以访问该Cookie。跨域名Cookie现在被广泛用在网络中。而Session则不会支持跨域名访问。Session仅在他所在的域名内有效。 

 

Cookie的操做:

添加Cookie

Cookie cookie = new Cookie("user", "suntao");
  cookie.setMaxAge(7*24*60*60);     // 一星期有效
  response.addCookie(cookie);

 

获取Cookie

// 由于取得的是整个网页做用域的Cookie的值,因此获得的是个数组
  Cookie[] cookies = request.getCookies();

  for(int i = 0 ; i < cookies.length ; i++){
   String name = cookies[i].getName() ;
    String value = cookies[i].getValue() ;
   }    
相关文章
相关标签/搜索