[web]深入理解Session和Cookie
一、理解Cookie
由于http是一种无状态的协议,当用户的一次访问结束后,后端的服务器就无法知道下一次来访问的请求是不是上一次的用户了。那么Cookie的作用就是用户通过http访问一个服务器时,这个服务器会将一些Key/Value属性返回给客户端浏览器,并且给这些数据加上一定的限制条件,在符合条件的情况下客户端下一请求再带着这些数据来访问服务器,那么这些数据又被完整的带回来了,此时服务器就可以根据这些数据判断是否是同一个用户访问了。
Cookie的属性项
| 属性项 | 简介 |
| NAME=VALUE | 存放键值对,需要注意的是这设置的NAME不能和其他属性项同名。 |
| Expires | 过期时间,过了设置的时间点后,Cookie就会失效 |
| Domain | 生成Cookie的域名,如"Domain=baidu.com" |
| Path | Cookie生成的路径,如path=/stu-manager |
| Secure | 如果设置了这个属性,那么只有在ssh连接时才能回传Cookie |
Cookie如何工作
Cookie是怎么加到Http的Header中的?当我们在程序使用HttpServletResponse.addCookie()后,在Tomcat容器中会将这个Cookie的信息往上传递,知道org.apache.catalina.connector.Response,调用方法addCookie,再次方法中又调用了 generateCookieString() 方法生成了关于的Cookie的字符串,再调用addHeader方法将Cookie信息写到响应头的,时序图如下:

源代码:
public void addCookie(final Cookie cookie) {
// Ignore any call from an included servlet
if (included || isCommitted()) {
return;
}
// 添加到 cookies列表中
cookies.add(cookie);
// 关于cookie信息的字符串
String header = generateCookieString(cookie);
//if we reached here, no exception, cookie is valid
// the header name is Set-Cookie for both "old" and v.1 ( RFC2109 )
// RFC2965 is not supported by browsers and the Servlet spec
// asks for 2109.
// 添加到响应头
addHeader("Set-Cookie", header, getContext().getCookieProcessor().getCharset());
}
使用Cookie的限制
Cookie是HTTP头中的一个字段,虽然HTTP本身对这个字段没有要求,但是Cookie最终是存放在浏览器中,所以不同浏览器对Cookie的限制虽然不同,但总是有限制的

二、理解Session
Cookie可以让服务端跟踪每个客户端的访问,但是每次客户端的访问都带着Cookie,如果访问量很大的时候,那么就会增加大量网络传输。而Session就是为解决这个问题的。客户端每次访问服务器时,不需要每次都回传一个完成的Cookie,只需要传一个ID。这个ID是客户端第一次访问服务器时随机生成的,唯一的。它包装在一个叫做JSESSIONID的Cookie中回传。(禁用Cookie时使用URL重写的方式回传)
Session如何工作
有了SessionID,我们就可以通过Request创建Session了。

三、Cookie的安全问题
Cookie和Session'都可以跟踪客户端的访问记录,但是他们的工作方式全然不同,Cookie将所有要保存的数据通过服务端传到客户端,客户端再将其保存到浏览器中,所以这些Cookie信息可以被我们看到,甚至可以修改,所以Cookie的安全级别并不高。但是Session的安全性就要高很多了,因为Session将数据存放在服务端,在客户端存储的只是一个SessionID而已。另外Session的大小虽然没有限制,但是它是存放在服务端的,从性能考虑,也不宜存放太多数据。
[web]深入理解Session和Cookie的更多相关文章
- 理解Session与Cookie
写在前面的话:Session和Cookie是非常有意思的两个概念,对于两者的管理可以处理的很复杂,但是无论如何,理解Session和Cookie的基本概念和发明初衷,对于问题的解决,大有裨益. === ...
- 转!!深入理解 Session 与 Cookie
摘要 Session 与 Cookie 不管是对 Java Web 的初学者还是熟练使用者来说都是一个令人头疼的问题.在初入职场时恐怕很多程序员在面试的时候都被问到过这个问题.其实这个问题回答起来既简 ...
- 深入理解 Session 与 Cookie
Session 与 Cookie 的作用都是为了保持访问用户与后端服务器的交互状态.它们有各自的优点,也有各自的缺陷,然而具有讽刺意味的是它们的优点和它们的使用场景又是矛盾的.例如,使用 Cookie ...
- 【转】深入理解 Session 与 Cookie
Session 与 Cookie 不管是对 Java Web 的初学者还是熟练使用者来说都是一个令人头疼的问题.在初入职场时恐怕很多程序员在面试的时候都被问到过这个问题.其实这个问题回答起来既简单又复 ...
- 理解session和cookie
Session 与 Cookie 的作用都是为了保持访问用户与后端服务器的交互状态.它们有各自的优点,也有各自的缺陷,然而具有讽刺意味的是它们的优点和它们的使用场景又是矛盾的.例如,使用 Cookie ...
- 第10章 深入理解Session与Cookie
需要很多Cookie时,考虑HTTP对Cookie数量和大小的限制. 几百或更多台服务器的时候,如何解决Session在多态服务器之间共享的问题. 还有一些安全问题,如Cookie被盗,Cookie伪 ...
- 深入理解Session和Cookie机制
具体来说cookie机制采用的是在客户端保持状态的方案.它是在用户端的会话状态的存贮机制,他需要用户打开客户端的cookie支持.cookie的作用就是为了解决HTTP协议无状态的缺陷所作的努力. 而 ...
- 深入理解Session与Cookie(一)
Session,Cookie简介: Session和Cookie的作用都是为了保持用户与后端服务器的交互状态,但是各自都有缺陷: Cookie: 随着Cookie的个数的增多和访问量的增加,它占用的网 ...
- web 开发常见问题--Session 与 Cookie 却别
总结: 1.首先,session与cookie都是保存数据的,存在的原因很大程度上是为了解决HTTP协议的无状态特性 2.都是保存数据,却别在于cookie保存在客户端,由浏览器管理,session保 ...
随机推荐
- msyql中子查询IN,EXISTS,ANY,ALL,SOME,UNION介绍
1.ANY关键字 假设any内部的查询语句返回的结果个数是三个,如:result1,result2,result3,那么, select ...from ... where a > any(.. ...
- p4980 polya定理
传送门 分析 orz ymh 代码 #include<iostream> #include<cstdio> #include<cstring> #include&l ...
- EF配置文件初始化数据库 codefirst
. using ConsoleApplication42; using System.Data.Entity; using System.Data.Entity.ModelConfiguration. ...
- BAdi:BOM_UPDATE - Check update for BOM Save
需求:BOM中替代项目组要求同一组比率之和必须是100. 实现:BAdi:BOM_UPDATE METHOD if_ex_bom_update~change_at_save. DATA: ls_wa ...
- mariadb主从备份
mariadb主从备份 master主库配置 停止mariadb systemctl stop mariadb 修改配置文件my.conf vim /etc/my.cnf [mysqld] serve ...
- [GO]go语言实现区块链工作证明(pow)原理
package main import ( "math/big" "bytes" "math" "crypto/sha256&qu ...
- zrender源码分析2--初始化Storage
接上次分析到初始化ZRender的源码,这次关注内容仓库Storage的初始化 入口1:new Storage(); // zrender.js /** * ZRender接口类,对外可用的所有接口都 ...
- 'System.ValueTuple, Version=0.0.0.0 required for Add-Migration on .NET 4.6.1 Class Library
https://stackoverflow.com/questions/45978173/system-valuetuple-version-0-0-0-0-required-for-add-migr ...
- leetcode 加一
给定一个非负整数组成的非空数组,在该数的基础上加一,返回一个新的数组. 最高位数字存放在数组的首位, 数组中每个元素只存储一个数字. 你可以假设除了整数 0 之外,这个整数不会以零开头. 示例 1: ...
- leetcode 两个数组的交集 II
给定两个数组,写一个方法来计算它们的交集. 例如: 给定 nums1 = [1, 2, 2, 1], nums2 = [2, 2], 返回 [2, 2]. /** * @param {number[] ...