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就可以满足要求。

浅析Session和Cookie的更多相关文章

  1. 浅析Django之session与cookie

    浅析Django之session与cookie 1 session与cookie概述 原理: 由于HTTP协议是无状态,无连接的,当用户发起网路请求时,需要服务端能标识用户ID,用以存储用户相关信息, ...

  2. 浅析session&cookie

    session&cookie没有出现的黑暗时代 大家都知道,HTTP协议是一种无状态的协议,本次请求下一次请求没有任何的关联,所有没有办法直接用http协议来记住用户的信息,试想一向,每一次点 ...

  3. 浅析PHP中cookie与session技术

    1.cookie是什么? cookie指某些站点为了辨别用户身份.进行session跟踪而储存在用户本地终端上的数据(通常经过加密). 通俗来理解就是,你去一个专卖店或者超市买东西,然后店里给你办一张 ...

  4. 理解Session与Cookie

    写在前面的话:Session和Cookie是非常有意思的两个概念,对于两者的管理可以处理的很复杂,但是无论如何,理解Session和Cookie的基本概念和发明初衷,对于问题的解决,大有裨益. === ...

  5. PHP之session与cookie

    1.session与cookie的关系 众所周知,session是存储在服务器端,cookie是存储在客户端,如果禁用了浏览器的cookie功能,很多时候(除非进行了特殊配置)服务器端就无法再读取se ...

  6. 安全退出,清空Session或Cookie

    概览: 网站中点击退出,如果仅仅是重定向到登录/出页面,此时在浏览器地址栏中输入登录后的某个页面地址如主页,你会发现不用登录就能访问.这种所谓的退出并不是安全的. 那么怎样做到安全退出呢? 那就是点击 ...

  7. 11月7日上午PHP会话控制(session和cookie)、跨页面传值

    1.session  登录上一个页面以后,长时间没有操作,刷新页面以后需要重新登录. 特点:(1)session是存储在服务器:   (2)session每个人(登陆者)存一份: (3)session ...

  8. 【荐】PHP Session和Cookie,Session阻塞,Session垃圾回收,Redis共享Session,不推荐Memcached保存Session

    什么是 Session 在 web 应用开发中,Session 被称为会话.主要被用于保存某个访问者的数据. 由于 HTTP 无状态的特点,服务端是不会记住客户端的,对服务端来说,每一个请求都是全新的 ...

  9. Session与Cookie概念

    摘:一.Session机制session是一种服务器端的状态管理技术,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息.当程序需要为某个客户端的请求创建一个session的时候,服务 ...

随机推荐

  1. 差值的再议-Hermite差值

    1. 插值法 插值法又称“内插法”,是利用函数f (x)在某区间中已知的若干点的函数值,作出适当的特定函数,在区间的其他点上用这特定函数的值作为函数f (x)的近似值,这种方法称为插值法. 如果这特定 ...

  2. linux 查看、关闭 ssh pts/n登录的用户

    1.查看登录用户: [root@TiaoBan- bin]# w :: up days, :, users, load average: 1.90, 1.75, 1.84 USER TTY FROM ...

  3. Monkey学习网址

    http://***/2015/12/24/Android-Monkey-Test/ http://bbs.pediy.com/showthread.php?t=189584 http://***/2 ...

  4. 1.Django入门

    MVC 大部分开发语言中都有MVC框架 MVC框架的核心思想是:解耦 降低各功能模块之间的耦合性,方便变更,更容易重构代码,最大程度上实现代码的重用 m表示model,主要用于对数据库层的封装 v表示 ...

  5. OS基础:动态链接库(二)

    1.vc6.0新建工程MFC AppWizard[dll]工程 命名LptMfcDll1 2.在lptMfcDll1.h添加函数名声明 添加的代码: //lptAddBegin void lptMfc ...

  6. [Proposal]Transform ur shapes!

    [Name] Transform ur shapes [Motivation]市场上有很多涂鸦游戏,例如火柴人涂鸦,非常有趣 我们可以结合所学,将一些图形变形的操作融入进去,做一个我们自己的有趣的游戏 ...

  7. nginx 常见错误释义

    错误信息 错误说明 "upstream prematurely(过早的) closed connection" 请求uri的时候出现的异常,是由于upstream还未返回应答给用户 ...

  8. 浏览器环境下JavaScript脚本加载与执行探析之动态脚本与Ajax脚本注入

    在<浏览器环境下JavaScript脚本加载与执行探析之defer与async特性>中,我们研究了延迟脚本(defer)和异步脚本(async)的执行时机.浏览器支持情况.浏览器bug以及 ...

  9. 【062有新题】OCP 12c 062出现大量之前没有的新考题-16

    choose one Which users are created and can be used for database and host management of your DBaaS da ...

  10. 《Python自动化运维之路》 系统基础信息模块(一)

    系统性能收集模块Psutil 目录: 系统性能信息模块psutil 系统性能信息模块psutil psutil能够轻松实现获取系统运行的进程和系统利用率包括(CPU,内存,磁盘 和网络)等.主要用于系 ...