zoukankan      html  css  js  c++  java
  • 浅析Session和Cookie

     Cookie      

         Cookie的作用,就是当一个用户通过http访问一个服务器时,这个服务器会将一些key/value键值对返回给客户端浏览器,并给这些数据加上一些限制条件,在条件符合时这个用户访问该服务器时,数据又被完整的带回服务器,因此服务器可以根据Cookie值来划分访问的用户。

          当前Cookie有两种版本:Version0 和Version1, 它们有两种设置响应头的标识,分别是"Set-Cookie" 和 "Set-Cookie2"。

          Version 0属性介绍:

    属性项 属性项介绍
    NAME=VALUE 键值对
    Expires 过期时间
    Domain 生成该Cookie的域名
    Path 生成Cookie的路径
    Secure 如果设置了该属性,只有在SSH连接时才回传该Cookie

        Version 1属性介绍: 和Version 0差不多,有几个新属性:Max-Age(最大失效时间)、Port(该Cookie在什么端口可以回传服务器端)。

       Cookie的工作原理

                      服务器端通过request.getCookies()获取Cookie数组。通过response.addCookie("key", "val")添加key/value值,最后通过response.getHeaders("Set-Cookie")返回Cookie。

       Cookie是HTTP头的一个字段,但是http对该字段没有太多限制,由于最终Cookie存储在浏览器里,所以不同浏览器对Cookie都有一些限制。

    Session

      Cookie可以让服务器端程序跟踪每个客户端的访问,但是每次客户端的访问必须回传这些Cookie,如果Cookie很多,则无形中增加了客户端和服务器端的数据传输量,消耗传输带宽,而Session的出现正是为了解决这个问题。

       同一个客户端每次与服务器端交互时,不需要每次都回传所有的Cookie值,只需要回传NAME为JESIONID的Cookie,这个ID是客户端第一次访问服务器时生成的,可以唯一标识一个客户端。

    Session的三种实现方式

    • 基于URL Path Parameter,默认支持: 当浏览器不支持Cookie功能时,浏览器将用户的SessionCookieName重写到用户请求的URL参数中
    • 基于Cookie,如果没有修改Context容器的Cookie标识,默认也支持 : 优先级别高,Cookie的Session ID会覆盖第一种方式URL中的Session ID。
    • 基于SSL,默认不支持,只有connector.getAttribute("SSLEnabled")为TRUE时才支持。

    Session的工作流程

      获取Session ID后,服务器端可以创建HttpSession对象,第一次触发通过request.getSession()方法。如果当前的Session ID还没有对应的HttpSession对象,则创建一个新的HttpSession对象,并把它加入到org.apache.catalina.Manager 的Session容器中保存。Manager类将管理所有Session的生命周期,Session过期将被回收,服务器关闭时,如果Session还没有过期则会被序列化到磁盘,只要这个HttpSession对象存在,用户就可以根据Session ID来获取这个对象,就做到了对状态的保持。

    Cookie和Session的安全问题    

       Cookie的所有数据均存储在客户端的浏览器里,因此Cookie数据可以被访问到并且可以被修改,因此它的安全性不高。相比较而言,Session的安全性要高很多。因为Session将数据存储在服务端,只是通过Cookie传递一个Session ID而已,所以Session更适合存储用户隐私和重要的数据。

    分布式Session框架

      在大型互联网系统中,单独使用Cookie和Session都是不可行的。因为如果单独使用Cookie,则可以很好地解决应用的分布式部署问题,大型互联网系统的一个应用有上百台机器,而且有很多不同的应用系统协同工作,由于Cookie值存储在客户端的浏览器里,用户每次访问都会将最新的值带回给处理该请求的服务器,所以也就解决了同一个用户的请求可能不在同一台服务器处理而导致的Cookie不一致的问题。但是考虑到客户端对Cookie存储的限制、Cookie管理的混乱和令人担忧的安全性,Cookie并不是最佳的解决方案。

      使用服务订阅服务器,在应用启动时可以从该服务器订阅该应用需要的可写Session项和可写Cookie项配置,用来精确控制哪些应用可以操作哪些Session和Cookie,可以有效控制Session安全性和Cookie的数量。Zookeeper集群管理服务器就可以统一管理所有服务器的配置文件。

      由于Session存储在服务器端,考虑带同一个应用可能会部署在多台服务器上,要实现同一个应用的多服务器共享Session必须将它们存储在一个分布式缓存中,可以随时写入和读取,同时还需要良好的性能支持。MemCache和淘宝开源的分布式缓存系统Tair就可以满足要求。

       

        

      

  • 相关阅读:
    开源中国在线插件工具
    本本变身路由 iPad通过笔记本上网(转)
    Windows 7 中让IIS7支持shtml功能及在ASP.Net中使用UrlRewritingNet实现链接重写
    URLRewrite伪静态与AspNetPager分页控件的结合
    CSS 连接地址后面加上问号(?)表示什么意思?
    .net 下如何将文档文件(Word, Pdf等) 中的文本提取出来(转)
    常用JQuery插件整理(转)
    解决PowerDesigner 16 Generate Datebase For Sql2005 找不到sysproperties表的问题(转,并修改了里面的错误)
    Jquery实用代码片段(转)
    Jquery+ashx当把鼠标放到每篇文章时,自动显示该文章的缩略内容( 图片)的异步加载方法
  • 原文地址:https://www.cnblogs.com/bywallance/p/6720484.html
Copyright © 2011-2022 走看看