1.为什么要有cookie/session?

  • HTTP是一种无状态的协议,为了分辨链接是谁发起的,需自己去解决这个问题。不然有些情况下即使是同一个网站每打开一个页面也都要登录一下。而Session和Cookie就是为解决这个问题而提出来的两个机制。

2.cookie/session执行流程

cookie执行流程

当你去访问服务器的时候,服务器如果想让浏览器保存点数据,这时服务器就产生一个键值对的数据(new cookie),把数据带到浏览器,浏览器会将次数据保存起来。(其底层就是通过一叫做set-cookie的响应头来实现的)。接下来当再次去访问服务器时候,浏览器会根据一定的规则将cookie带上(底层就是一个叫做cookie的请求头),这样在服务器端就可以通过方法获取这些数据.

Cookie的主要内容包括:名字,值,过期时间,路径和域(api 后面会讲)。使用Fiddler抓包就可以看见,比方说我们打开百度的某个网站可以看到Headers包括Cookie,如下:

key, value形式。过期时间可设置的,如不设,则浏览器关掉就消失了,存储在内存当中,否则就按设置的时间来存储在硬盘上的,过期后自动清除,比方说开关机关闭再打开浏览器后他都会还存在,前者称之为Session cookie 又叫 transient cookie(临时cookie),后者称之为Persistent cookie (持久化cookie)又叫 permenent cookie。路径和域就是对应的域名,a网站的cookie自然不能给b用。

session执行流程

客服端访问服务器,如果遇到了 getsession()方法。服务器会检查客户端是否携带了一个叫做JSESSIONID的cookie
没有携带
服务器在内存开辟一块空间(new session),同时会生成一个随机的唯一的字符串,将随机的字符串跟创建session对象关联起来( key->字符串,value->session对象)
放入在session池中,放回到客户端的时候,服务器会将字符串包装一下,new cookie("JSESSIONID",字符串),带回去给客户端
有携带:
将此cookie的中的值取出来,字符串取出来,把他当做key去session池中查找对应的session对象
找到了
根据业务逻辑操作session对象

没找到了
服务器在内存开辟一块空间(new session),同时会生成一个随机的唯一的字符串,将随机的字符串跟创建session对象关联起来放入在session池中( key->字符串,value->session对象),放回的时候,服务器会将字符串包装一下,new cookie("JSESSIONID",字符串),带回去给浏览器

sesion

存在服务器的一种用来存放用户数据的类HashTable结构。
浏览器第一次发送请求时,服务器自动生成了一HashTable和一Session ID来唯一标识这个HashTable,并将其通过响应发送到浏览器。浏览器第二次发送请求会将前一次服务器响应中的Session ID放在请求中一并发送到服务器上,服务器从请求中提取出Session ID,并和保存的所有Session ID进行对比,找到这个用户对应的HashTable。
一般这个值会有个时间限制,超时后毁掉这个值,默认30分钟。
当用户在应用程序的 Web页间跳转时,存储在 Session 对象中的变量不会丢失而是在整个用户会话中一直存在下去。
Session的实现方式和Cookie有一定关系。建立一个连接就生成一个session id,打开几个页面就好几个了,这里就用到了Cookie,把session id存在Cookie中,每次访问的时候将Session id带过去就可以识别了.

3.cookie的常用属性api
        Cookie cookie = new Cookie("name","tom"); // 新建Cookie
cookie就是键值对的数据,如果是中文不能直接设置,需要编码

Cookie cookie3 = new Cookie("realname",URLEncoder.encode("姓名","utf-8"));

cookie.setDomain("www.baidu.com"); // 设置域名
这样设置域名的话,该cookie会被提交到www.baidu.com但是不会被提交到zhidao.baidu.com。要想都提交过去,需要这样设置cookie.setDomain(".baidu.com");

cookie.setPath("/search"); // 设置路径   
这样设置路径,该cookie只会被提交到www.baidu.com/search路径下的页面,也就是说在www.baidu.com/aaa下的页面是获取不到该cookie的。一般cookie在某个网站里都是可用的,直接设置为/,cookie.setPath("/");

cookie.setMaxAge(60*60*24*7); // 设置有效期
MaxAge属性单位为秒,默认为-1也就是关闭浏览器自动销毁(临时cookie)。cookie.setMaxAge(60*60*24*7); 这样设置意思是不管浏览器关闭与否,将此cookie持久化到客户端文件里保存一周。参数为正数时浏览器都会将相应的cookie做持久化处理。

response.addCookie(cookie); // 输出到客户端
4.session常用api

HttpSession session = request.getSession(); // 创建session

session.setAttribute("name","tom"); // 设置Session属性

out.println("欢迎您:" +session.getAttribute("name")); // 获取Session属性

销毁session ServletActionContext.getRequest().getSession().invalidate();

通过java代码设置
session.setMaxInactiveInterval(30*60);//以秒为单位,即在没有活动30分钟后,session将失效

在tomcat配置文件中配置session的超时时间
            <session-config>
                <session-timeout>分钟为单位</session-timeout>
            </session-config>

5cookie/session的区别与联系区别:

1.cookie存放在客户端,session存放在服务器端。

2.cookie只能存放4k的数据,而session理论上没有做限制

联系:

session虽说存放在服务器端,但是仔细看刚才的执行流程你会明白,session是依赖于cookie的,这一点也是本篇文章想要着重强调的

7.cookie/session使用注意事项
1.cookie大小有限制 4k

2.cookie不能跨浏览器

3.cookie默认不支持中文(但是可以通过转码)

4.cookie对于浏览器 一个浏览器中最多可以保存300cookie 为每个网站最多20个

5.如果是安全性较高的数据应存放在session中,因为cookie存放在客户端总会轻易被不法分子获取

6.如果是访问量特别大的网站,尽量不要在session中存储用户数据,因为每个用户存一个session会给服务器造成很大的压力
7.cookie 创建默认是临时cookie 就是浏览器关闭,cookes失效,而seesion创建默认是30分钟, cookie 和seesion 都可以持久化(设置时间)。

8.session 的使用是依赖cookie的 应为session的唯一标示sessionID 放在cookie中,下面会讲下工作遇到的坑。

6.新手使用session时常踩的坑

很多人使用session时希望用户信息可以保存一段时间比如保存7天,于是配置了Tomcat的

<session-config>

<session-timeout>7天</session-timeout>

</session-config>。

配置完后发现,关闭浏览器后再访问还是取不到session。这是因为session的配置没起作用吗?不是的,其实session还是存在于服务器的,只是没有设置cookie持久化,cookie默认就会在浏览器关闭时销毁,所以叫做JSESSIONID的cookie也被销毁了,再到服务器的时候没有这个叫JSESSIONID的cookie就取不到相关的session了。

所以,如果想7天内都能访问到session,需要将cookie也设置持久化!

转载于:https://www.cnblogs.com/xiaowangbangzhu/p/10535850.html

cookie和session的区别及其原理相关推荐

  1. nodejs的koa中cookie和session的使用,cookie和session的区别

    1.cookie是存储于访问者的计算机中的数据,用于同一浏览器访问同一域的时候共享数据 2.HTTP是无状态协议.也就是说:当你浏览了一个页面,然后跳转到同一个网站的另一个页面,服务器无法认识到这是同 ...

  2. Cooki和session的区别和原理:

    一.Cookie和Session的区别和优缺点 1.cookie数据存放在客户的浏览器上,session数据放在服务器上. 2.cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COO ...

  3. cookie 和session 的区别详解

    转自 https://www.cnblogs.com/shiyangxt/archive/2008/10/07/1305506.html 这些都是基础知识,不过有必要做深入了解.先简单介绍一下. 二者 ...

  4. Cookie 与Session 的区别

    Cookie 与Session 的区别(转载) 原地址: http://www.cnblogs.com/shiyangxt/archive/2008/10/07/1305506.html 两个都可以用 ...

  5. cookie,session的区别和联系(补充token)

    文章目录 1 http为什么是无状态的 2 cookie 和session 的区别详解 3 token 参考: 备注: 博客文章仅限于学习,禁止商用 1 http为什么是无状态的 2 cookie 和 ...

  6. cookie 和session 的区别

    session是保存在服务器端的,cookie是保存在客户端的. 二者的定义: 当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择 ...

  7. Token ,Cookie和Session的区别

    Cookie cookie 是一个非常具体的东西,指的就是浏览器里面能永久存储的一种数据,仅仅是浏览器实现的一种数据存储功能. cookie由服务器生成,发送给浏览器,浏览器把cookie以kv形式保 ...

  8. Cookie和Session的区别与联系

    Cookie和Session Session 会话的理解 Session的作用 HTTP协议的无状态特点 Session的实现原理(重点) Session常用方法: Cookie 基本介绍 经典案例 ...

  9. 90%的程序员都没有完全回答对 Cookie 和 Session 的区别?

    我在做面试官的时候,曾经问过很多朋友这个问题: Cookie 和 Session 有什么区别呢?大部分的面试者应该都可以说上一两句,比如:什么是 Cookie?什么是 Session?两者的区别等. ...

  10. 什么是Cookie和Session?—— Cookie和Session的区别?—— 一文教你理解清楚什么是Cookie和Session,以及常见的开发面试问题?

    cookie和session区别 cookie和session 背景说明 1.cookie 1.1.定义 1.2.作用 1.3.组成(种类和参数) 1.3.1.会话 Cookies .永久性 Cook ...

最新文章

  1. 剑指offer:第一个只出现一次的字符
  2. Android布局之weight属性解析
  3. Linux C编程--进程间通信(IPC)5--System V IPC 机制2--信号量
  4. numpy python2_python-numpy(2)
  5. python中列表的运用_python中列表的应用
  6. BZOJ3160: 万径人踪灭
  7. Redis 过期键删除策略、内存淘汰机制
  8. SAP 电商云 Spartacus UI 4.1 版本的延迟加载技术介绍
  9. apache cgi 模块安装
  10. 和后台如何对接_业务系统如何对接第三方服务?
  11. BDD敏捷开发入门与实战
  12. 高清网络视频无损FLV教程
  13. 1.linux系统基础笔记(互斥量、信号量)
  14. Reporting Services Internal Error(诡异的问题)-【转载】
  15. IOS开发基础知识--碎片9
  16. Atitit 网络设备的自动发现机制 需求如下: 1、自动获取当前设备所在网段及当前与当前网段有连接的网段的所有IP,并判断出是哪类设备。如:服务器、交换机、防火墙等。 2、如何根据第1点得到的
  17. 中国人民银行招聘计算机考什么,求中国人民银行招聘计算机专业人员的考试题。...
  18. 定时开关机实现原理-Android4.4/6.0
  19. html5一阶段考试题,千锋HTML5-JS阶段第三周理论考试题目02
  20. Java分布式中文分词组件 - word分词(转自:https://github.com/ysc/word)

热门文章

  1. 【大数据部落】R语言多元Copula GARCH 模型时间序列预测
  2. 操作系统数据结构知识点总结1
  3. Keras版GCN源码解析
  4. caffe中网络结构参数详解
  5. python数字图像处理(4):图像数据类型及颜色空间转换
  6. oracle应用技术支持,oracle技术支持工程师岗位职责
  7. php1054,php – 找不到列:1054’字段列表’Laravel中的未知列’_token’
  8. C++ 引用 支持多级嵌套吗
  9. TBB concurrent_set 没有erase
  10. 【Django 2021年最新版教程19】数据库查询 model filter 条件或or