浅析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就可以满足要求。
浅析Session和Cookie的更多相关文章
- 浅析Django之session与cookie
浅析Django之session与cookie 1 session与cookie概述 原理: 由于HTTP协议是无状态,无连接的,当用户发起网路请求时,需要服务端能标识用户ID,用以存储用户相关信息, ...
- 浅析session&cookie
session&cookie没有出现的黑暗时代 大家都知道,HTTP协议是一种无状态的协议,本次请求下一次请求没有任何的关联,所有没有办法直接用http协议来记住用户的信息,试想一向,每一次点 ...
- 浅析PHP中cookie与session技术
1.cookie是什么? cookie指某些站点为了辨别用户身份.进行session跟踪而储存在用户本地终端上的数据(通常经过加密). 通俗来理解就是,你去一个专卖店或者超市买东西,然后店里给你办一张 ...
- 理解Session与Cookie
写在前面的话:Session和Cookie是非常有意思的两个概念,对于两者的管理可以处理的很复杂,但是无论如何,理解Session和Cookie的基本概念和发明初衷,对于问题的解决,大有裨益. === ...
- PHP之session与cookie
1.session与cookie的关系 众所周知,session是存储在服务器端,cookie是存储在客户端,如果禁用了浏览器的cookie功能,很多时候(除非进行了特殊配置)服务器端就无法再读取se ...
- 安全退出,清空Session或Cookie
概览: 网站中点击退出,如果仅仅是重定向到登录/出页面,此时在浏览器地址栏中输入登录后的某个页面地址如主页,你会发现不用登录就能访问.这种所谓的退出并不是安全的. 那么怎样做到安全退出呢? 那就是点击 ...
- 11月7日上午PHP会话控制(session和cookie)、跨页面传值
1.session 登录上一个页面以后,长时间没有操作,刷新页面以后需要重新登录. 特点:(1)session是存储在服务器: (2)session每个人(登陆者)存一份: (3)session ...
- 【荐】PHP Session和Cookie,Session阻塞,Session垃圾回收,Redis共享Session,不推荐Memcached保存Session
什么是 Session 在 web 应用开发中,Session 被称为会话.主要被用于保存某个访问者的数据. 由于 HTTP 无状态的特点,服务端是不会记住客户端的,对服务端来说,每一个请求都是全新的 ...
- Session与Cookie概念
摘:一.Session机制session是一种服务器端的状态管理技术,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息.当程序需要为某个客户端的请求创建一个session的时候,服务 ...
随机推荐
- 20155326 《Java程序设计》实验五网络编程与安全实验报告
20155326 <Java程序设计>实验五网络编程与安全实验报告 实验内容 任务一 1.两人一组结对编程: 参考http://www.cnblogs.com/rocedu/p/67667 ...
- Codeforces820A Mister B and Book Reading 2017-06-28 09:38 67人阅读 评论(0) 收藏
A. Mister B and Book Reading time limit per test 2 seconds memory limit per test 256 megabytes input ...
- hdu 4911 求逆序对数+树状数组
http://acm.hdu.edu.cn/showproblem.php?pid=4911 给定一个序列,有k次机会交换相邻两个位置的数,问说最后序列的逆序对数最少为多少. 实际上每交换一次能且只能 ...
- Android Studio-引用jar及so文件
一.引用jar文件 1.将jar文件复制.粘贴到app的libs目录中: 2.右键点击jar文件,并点击弹出菜单中的“Add As Library”,将jar文件作为类库添加到项目中: ...
- 七种bond模式说明
第一种模式:mod=0 ,即:(balance-rr) Round-robin policy(平衡抡循环策略) 特点:传输数据包顺序是依次传输(即:第1个包走eth0,下一个包就走eth1….一直循环 ...
- [ASE][Daily Scrum]11.06
我们的<坦克大战·无尽>正式开始动工了,今天的任务计划如下~ [Plan] View Shilin Liu 搭建好开发环境 收集素材 Control Jiafan Zhu ...
- Cannot retrieve metalink for repository: epel/x86_64. Please verify its path and try again 问题分析
Cannot retrieve metalink for repository: epel/x86_64. Please verify its path and try again Loaded pl ...
- Win7下无法启动sql server fulltext search (mssqlserver)的问题
在Win7下安装了SQL Server 2005, 但启动“SQL Server FullText Search (MSSQLSERVER)”服务时启动不成功,系统日志显示“SQL Server Fu ...
- owa2013配置HTTPS
- MVC 5 Strongly Typed Views(强类型视图)
学习MVC这样久以来,发觉网站上很多MVC的视频或是文章,均是使用Strongly Type views来实现控制器与视图的交互.Insus.NET以前发布的博文中,也大量使用这种方式: <Da ...