session与cookie的区别(面试可参考)

news/2024/5/18 15:46:00 标签: session, cookie

sessioncookie_0">sessioncookie的区别?

1、session保存在服务器,客户端不知道其中的信息;cookie保存在客户端,服务器能够知道其中的信息。

2、session中保存的是对象,cookie中保存的是字符串。

3、session不能区分路径,同一个用户在访问一个网站期间,所有的session在任何一个地方都可以访问到。而cookie中如果设置了路径参数,那么同一个网站中不同路径下的cookie互相是访问不到的。

4、session需要借助cookie才能正常工作。如果客户端完全禁止cookiesession将失效。


1、Cookie和Session都是会话技术,Cookie是运行在客户端,Session是运行在服务器端。

2、Cookie有大小限制以及浏览器在存cookie的个数也有限制,Session是没有大小限制和服务器的内存大小有关。

3、Cookie有安全隐患,通过拦截或本地文件找得到你的cookie后可以进行攻击。

4、Session是保存在服务器端上会存在一段时间才会消失,如果session过多会增加服务器的压力。
session原理:


1、session是保存在服务器端,理论上是没有是没有限制,只要你的内存够大

2、浏览器第一次访问服务器时会创建一个session对象并返回一个JSESSIONID=ID的值,
创建一个Cookie对象key为JSSIONID,value为ID的值,将这个Cookie写回浏览器

3、浏览器在第二次访问服务器的时候携带Cookie信息JSESSIONID=ID的值,如果该JSESSIONID的session已经销毁,
那么会重新创建一个新的session再返回一个新的JSESSIONID通过Cookie返回到浏览器

4、针对一个web项目,一个浏览器是共享一个session,就算有两个web项目部署在同一个服务器上,针对两个项目的session是不同的
如:你在tomcat上同时部署了两个web项目,分别是web1、web2。当你在一个浏览器上同时访问web1时创建的session是A1,访问web2时创建的session是A2。
后面你再多次访问web1使用的session还是A1,多次访问web2时使用session就是A2

5、session是基于Cookie技术实现,重启浏览器后再次访问原有的连接依然会创建一个新的session
因为Cookie在关闭浏览器后就会消失,但是原来服务器的Session还在,只有等到了销毁的时间会自动销毁

6、如果浏览器端禁用了Cookie,那么每次访问都会创建一个新的Session,但是我们可以通过服务器端程序重写URL即可,如果页面多连接多,会增加不必要的工作量,


http是无状态的协议,客户每次读取web页面时,服务器都打开新的会话,而且服务器也不会自动维护客户的上下文信息

一般浏览器提供了两种方式来保存,还有一种是程序员使用html隐藏域的方式自定义实现:

[1] 使用Cookie来保存,这是最常见的方法,本文“记住我的登录状态”功能的实现正式基于这种方式的。服务器通过设置Cookie的方式将Session ID发送到浏览器。如果我们不设置这个过期时间,那么这个Cookie将不存放在硬盘上,当浏览器关闭的时候,Cookie就消失了,这个Session ID就丢失了。如果我们设置这个时间为若干天之后,那么这个Cookie会保存在客户端硬盘中,即使浏览器关闭,这个值仍然存在,下次访问相应网站时,同 样会发送到服务器上。

[2] 使用URL附加信息的方式,也就是像我们经常看到JSP网站会有aaa.jsp?JSESSIONID=*一样的。这种方式和第一种方式里面不设置Cookie过期时间是一样的。

[3] 第三种方式是在页面表单里面增加隐藏域,这种方式实际上和第二种方式一样,只不过前者通过GET方式发送数据,后者使用POST方式发送数据。但是明显后者比较麻烦。

cookiesession的区别:

cookie数据保存在客户端,session数据保存在服务器端。

简 单的说,当你登录一个网站的时候,如果web服务器端使用的是session,那么所有的数据都保存在服务器上面,客户端每次请求服务器的时候会发送 当前会话的sessionid,服务器根据当前sessionid判断相应的用户数据标志,以确定用户是否登录,或具有某种权限。由于数据是存储在服务器 上面,所以你不能伪造,但是如果你能够获取某个登录用户的sessionid,用特殊的浏览器伪造该用户的请求也是能够成功的。sessionid是服务 器和客户端链接时候随机分配的,一般来说是不会有重复,但如果有大量的并发请求,也不是没有重复的可能性,我曾经就遇到过一次。登录某个网站,开始显示的 是自己的信息,等一段时间超时了,一刷新,居然显示了别人的信息。

如果浏览器使用的是 cookie,那么所有的数据都保存在浏览器端,比如你登录以后,服务器设置了 cookie用户名(username),那么,当你再次请求服务器的时候,浏览器会将username一块发送给服务器,这些变量有一定的特殊标记。服务器会解释为 cookie变量。所以只要不关闭浏览器,那么 cookie变量便一直是有效的,所以能够保证长时间不掉线。如果你能够截获某个用户的 cookie变量,然后伪造一个数据包发送过去,那么服务器还是认为你是合法的。所以,使用 cookie被攻击的可能性比较大。如果设置了的有效时间,那么它会将 cookie保存在客户端的硬盘上,下次再访问该网站的时候,浏览器先检查有没有 cookie,如果有的话,就读取该 cookie,然后发送给服务器。如果你在机器上面保存了某个论坛 cookie,有效期是一年,如果有人入侵你的机器,将你的 cookie拷走,然后放在他的浏览器的目录下面,那么他登录该网站的时候就是用你的的身份登录的。所以 cookie是可以伪造的。当然,伪造的时候需要主意,直接copy cookie文件到 cookie目录,浏览器是不认的,他有一个index.dat文件,存储了 cookie文件的建立时间,以及是否有修改,所以你必须先要有该网站的 cookie文件,并且要从保证时间上骗过浏览器,copy别人的 cookie登录,冒用了别人的名义发帖子,完全没有问题。

Session是由应用服务器维持的一个服务器端的存储空间,用户在连接服务器时,会由服务器生成一个唯一的SessionID,用该SessionID 为标识符来存取服务器端的Session存储空间。而SessionID这一数据则是保存到客户端,用Cookie保存的,用户提交页面时,会将这一 SessionID提交到服务器端,来存取Session数据。这一过程,是不用开发人员干预的。所以一旦客户端禁用Cookie,那么Session也会失效。

服务器也可以通过URL重写的方式来传递SessionID的值,因此不是完全依赖Cookie。如果客户端Cookie禁用,则服务器可以自动通过重写URL的方式来保存Session的值,并且这个过程对程序员透明。

可以试一下,即使不写Cookie,在使用request.getCookies();取出的Cookie数组的长度也是1,而这个Cookie的名字就是JSESSIONID,还有一个很长的二进制的字符串,是SessionID的值。


http://www.niftyadmin.cn/n/1624453.html

相关文章

spring data mongodb 设置副本集读写分离模式

2019独角兽企业重金招聘Python工程师标准>>> 一. 配置文件方式 <!-- 读写分离级别配置 --> <!-- 首选主节点&#xff0c;大多情况下读操作在主节点&#xff0c;如果主节点不可用&#xff0c;如故障转移&#xff0c;读操作在从节点。 --> <bean id&q…

cookie与session的区别(图文详解)

一、共同之处&#xff1a; cookie和session都是用来跟踪浏览器用户身份的会话方式。 二、工作原理&#xff1a; 1.Cookie的工作原理 &#xff08;1&#xff09;浏览器端第一次发送请求到服务器端 &#xff08;2&#xff09;服务器端创建Cookie&#xff0c;该Cookie中包含用户的…

i节点模拟

添加一块20G的硬盘分区fdisk /dev/sdbnp14Gnp232Mw内核重新加载一下partprobe /dev/sdbmkdir /datafdisk -l格式化 mkfs -t ext4 /dev/sdb2挂载 mount /dev/sdb2 /data/mount查看节点数 df -i /data/vi 11.sh#&#xff01;/bin/bashi1while [ $i -le 10029 ]dotouch /data/file…

分离你的spring配置文件,让结构更清晰

前言 接着上一篇的&#xff0c;这次框架的改变也成功分离了spring的配置文件。 以前&#xff0c;spring的配置文件从一开始的一点&#xff0c;到后面的逐渐变多&#xff0c;慢慢的&#xff0c;在一个spring的配置文件中就包含了好几块不同的bean的配置。有springMVC的&#xff…

while与do while区别(图文详解)

首先介绍while的使用&#xff0c;基本模式 while(循环条件){循环操作; }例 private void testwhile(){int i 0;while (i < 5) {i ;Log.e(TAG, "i " i);}}输出结果 i 1 i 2 i 3 i 4 i 5do while 的使用&#xff0c;基本模式 do {循环操作 } while(循环…

前端学习文档推荐

jQuery 基本原理 JavaScript 秘密花园 CSS参考手册 JavaScript 标准参考教程 ECMAScript 6入门 转载于:https://www.cnblogs.com/SoundOfTheSea/p/6709693.html

python 打印9*9乘法表

# -*- coding: utf8 -*- # Author:wxq1、 for i in range(1,10):for j in range(1,i1):print "%d*%d%2d"%(i,j,i*j),print ("")2、 for i in range(1,10):for k in range(1,10-i):print (" "),for j in range(1,i1):print "%d*%d%2d&quo…

杜教筛 [学习笔记]【更新中】

杜教筛 嘟嘟嘟 tangjz orz jiry_2 orz 任之洲 2016国家队论文 orz 概述 前置技能&#xff1a;莫比乌斯反演 可以在\(O(\frac{3}{4})\)或\(O(\frac{2}{3})\)复杂度完成数论函数(前缀和)的计算 一般形式 数论函数\(f(n)\)&#xff0c;求\[ S(n) \sum_{i1}^n f(i) \] 对于任意数论…