zoukankan      html  css  js  c++  java
  • 简述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存放在本地文件里,下一次访问Web Server的时候,再把Cookie的信息放到HTTP Request的“Cookie”header属性里面,这样jsessionid就随着HTTP Request返回给Web Server。

    实际上大多数的应用都是用 Cookie 来实现Session跟踪的,cookies是实现session的一种方式,通过cookies,把sessionID发送给服务器,来实现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的根本作用就是在客户端存储用户访问网站的一些信息。典型的应用有:

    1、记住密码,下次自动登录。

    2、购物车功能。

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

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

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

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

    3、安全性(隐私策略)的不同 

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

    4、有效期上的不同 

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

    5、对服务器造成的压力不同 

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

    6、 跨域支持上的不同 

    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() ;
       }    
  • 相关阅读:
    [转]责任链模式
    spring中常见注解描述
    [转]外观模式
    [转]策略模式
    分布式事务实践
    SpringBoot入门
    服务器性能调优
    kvm qemu内幕介绍
    xen 保存快照的实现之 —— device model 状态保存
    xen hypercall 的应用层实现
  • 原文地址:https://www.cnblogs.com/DSKer/p/10508261.html
Copyright © 2011-2022 走看看