cookie和session的区别 session与sessionStorage区别

  1. cookie的工作原理:浏览器第一次发送请求到服务器,服务器创建cookie,将cookie发送到浏览器;如果浏览器再次访问服务器,会携带着cookie;服务器根据浏览器发送过来的cookie,区分不同的用户、权限等
  2. session的工作原理:浏览器首次发送请求到服务器,服务器端创建一个session,同时创建一个cookie,发送到浏览器;浏览器再次访问服务器,会携带带有特殊id的cookie,服务器根据cookie中的sessionid,查看对应的session对象,区别用户
  3. 在客户端和服务端,cookie和session都是会话技术,cookie数据是存储到客户端,而session是存储到服务端
  4. 在浏览器中,cookie存储的数据大小有限 ;而session没有大小限制,跟服务端的内存有关
  5. cookie安全性差,可以通过拦截或本地文件可以对cookie进行攻击;而session运行在服务端,安全性高
  6. 如果浏览器禁用了cookie,那么cookie就不能使用,而session不能禁用

一、Cookie技术

Cookie技术是将用户的数据存储到客户端的技术,我们分为两方面学习:

第一,服务器端怎样将一个Cookie发送到客户端

第二,服务器端怎样接受客户端携带的Cookie

1.服务器端向客户端发送一个Cookie

1)创建Cookie:

Cookie cookie = new Cookie(String cookieName,String cookieValue);

示例:

​ Cookie cookie = new Cookie(“username”,“zhangsan”);

​ 那么该cookie会以响应头的形式发送给客户端:

​ 注意:Cookie中不能存储中文

2)设置Cookie在客户端的持久化时间:

cookie.setMaxAge(int seconds); —时间秒

注意:如果不设置持久化时间,cookie会存储在浏览器的内存中,浏览器关闭cookie信息销毁(会话级别的cookie),如果设置持久化时间,cookie信息会被持久化到浏览器的磁盘文件里

​ 示例:

​ cookie.setMaxAge(10*60);

​ 设置cookie信息在浏览器的磁盘文件中存储的时间是10分钟,过期浏览器 自动删除该cookie信息

3)设置Cookie的携带路径:

cookie.setPath(String path);

​ 注意:如果不设置携带路径,那么该cookie信息会在访问产生该cookie的web资源所在的路径都携带cookie信息

示例:

cookie.setPath(“/WEB16”);

代表访问WEB16应用中的任何资源都携带cookie

cookie.setPath(“/WEB16/cookieServlet”);

代表访问WEB16中的cookieServlet时才携带cookie信息

4)向客户端发送cookie:

response.addCookie(Cookie cookie);

5)删除客户端的cookie:

​ 如果想删除客户端的已经存储的cookie信息,那么就使用同名同路径的持久化时间为0的cookie进行覆盖即可

2.服务器端怎么接受客户端携带的Cookie

cookie信息是以请求头的方式发送到服务器端的:

1)通过request获得所有的Cookie:

Cookie[] cookies = request.getCookies();

2)遍历Cookie数组,通过Cookie的名称获得我们想要的Cookie

for(Cookie cookie : cookies){

if(cookie.getName().equal(cookieName)){

String cookieValue = cookie.getValue();

}

}

二、Session技术

Session技术是将数据存储在服务器端的技术,会为每个客户端都创建一块内存空间 存储客户的数据,但客户端需要每次都携带一个标识ID去服务器中寻找属于自己的内 存空间。所以说Session的实现是基于Cookie,Session需要借助于Cookie存储客 户的唯一性标识JSESSIONID

在Session这我们需要学习如下三个问题:

​ 怎样获得属于本客户端的session对象(内存区域)?

​ 怎样向session中存取数据(session也是一个域对象)?

​ session对象的生命周期?

1.获得Session对象

HttpSession session = request.getSession();

此方法会获得专属于当前会话的Session对象,如果服务器端没有该会话的Session 对象会创建一个新的Session返回,如果已经有了属于该会话的Session直接将已有 的Session返回(实质就是根据JSESSIONID判断该客户端是否在服务器上已经存在 session了)

2.怎样向session中存取数据(session也是一个域对象)

​ Session也是存储数据的区域对象,所以session对象也具有如下三个方法:

​ session.setAttribute(String name,Object obj);

​ session.getAttribute(String name);

​ session.removeAttribute(String name);

3.Session对象的生命周期(面试题/笔试题)

​ 创建:第一次执行request.getSession()时创建

​ 销毁:

​ 1)服务器(非正常)关闭时

​ 2)session过期/失效(默认30分钟)

​ 问题:时间的起算点 从何时开始计算30分钟?

​ 从不操作服务器端的资源开始计时(例如:当你访问淘宝页面时,点开页面不动,

第29分钟再动一下页面,就得重新计时30分钟;当过了30分钟,就失效了。

可以在工程的web.xml中进行配置

​ 30

3)手动销毁session

​ session.invalidate();

作用范围:

​ 默认在一次会话中,也就是说在,一次会话中任何资源公用一个session对象

**面试题:浏览器关闭,**session就销毁了?

不对,浏览器关闭和服务器session销毁没有任何关系!

总结:

购物过程中,cookie与session技术相结合图:

img

cookie购物流程图:

img

会话技术:

​ Cookie技术:存到客户端

发送cookie

​ Cookie cookie = new Cookie(name,value)

​ cookie.setMaxAge(秒)

​ cookie.setPath()

​ response.addCookie(cookie)

获得cookie

​ Cookie[] cookies = request.getCookies();

​ cookie.getName();

​ cookie.getValue();

session的操作流程图:

img

Session技术:存到服务器端 借助cookie存储JSESSIONID

HttpSession session = request.getSession();

setAttribute(name,value);

getAttribute(name);

session生命周期

创建:第一次指定request.getSession();

销毁:服务器关闭、session失效/过期、手动session.invalidate();

session作用范围:默认一次会话中

三、Session的客户端实现形式(即Session ID的保存方法)

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

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

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

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

cookie与session的区别:

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文件,并且要从保证时间上骗过浏览器,曾经在学校的vbb论坛上面做过试验,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的值。
三:Session与Cookie区别和联系:

Cookies是属于Session对象的一种。但有不同,Cookies不会占服务器资源,是存在客服端内存或者一个cookie的文本文件中;而“Session”则会占用服务器资源。所以,尽量不要使用Session,而使用Cookies。但是我们一般认为cookie是不可靠的,session是可靠地,但是目前很多著名的站点也都以来cookie。有时候为了解决禁用cookie后的页面处理,通常采用url重写技术,调用session中大量有用的方法从session中获取数据后置入页面。

Cookies与Session的应用场景:
Cookies的安全性能一直是倍受争议的。虽然Cookies是保存在本机上的,但是其信息的完全可见性且易于本地编辑性,往往可以引起很多的安全问题。所以Cookies到底该不该用,到底该怎样用,就有了一个需要给定的底线。

先来看看,网站的敏感数据有哪些。

登陆验证信息。一般采用Session(“Logon”)=true or false的形式。
用户的各种私人信息,比如姓名等,某种情况下,需要保存在Session里
需要在页面间传递的内容信息,比如调查工作需要分好几步。每一步的信息都保存在Session里,最后在统一更新到数据库。

当然还会有很多,这里列举一些比较典型的
假如,一个人孤僻到不想碰Session,因为他认为,如果用户万一不小心关闭了浏览器,那么之前保存的数据就全部丢失了。所以,他出于好意,决定把这些用Session的地方,都改成用Cookies来存储,这完全是可行的,且基本操作和用Session一模一样。那么,下面就针对以上的3个典型例子,做一个分析
很显然,只要某个有意非法入侵者,知道该网站验证登陆信息的Session变量是什么,那么他就可以事先编辑好该Cookies,放入到Cookies目录中,这样就可以顺利通过验证了。这是不是很可怕?
Cookies完全是可见的,即使程序员设定了Cookies的生存周期(比如只在用户会话有效期内有效),它也是不安全的。假设,用户忘了关浏览器 或者一个恶意者硬性把用户给打晕,那用户的损失将是巨大的。
这点如上点一样,很容易被它人窃取重要的私人信息。但,其还有一个问题所在是,可能这些数据信息量太大,而使得Cookies的文件大小剧增。这可不是用户希望所看到的。

显然,Cookies并不是那么一块好啃的小甜饼。但,Cookies的存在,当然有其原因。它给予程序员更多发挥编程才能的空间。所以,使用Cookies改有个底线。这个底线一般来说,遵循以下原则。
不要保存私人信息。
任何重要数据,最好通过加密形式来保存数据(最简单的可以用URLEncode,当然也可以用完善的可逆加密方式,遗憾的是,最好不要用md5来加密)。
是否保存登陆信息,需有用户自行选择。
长于10K的数据,不要用到Cookies。
也不要用Cookies来玩点让客户惊喜的小游戏。
四、cookie最典型的应用是:

(一):判断用户是否登陆过网站,以便下次登录时能够直接登录。如果我们删除cookie,则每次登录必须从新填写登录的相关信息。

(二):另一个重要的应用是“购物车”中类的处理和设计。用户可能在一段时间内在同一家网站的不同页面选择不同的商品,可以将这些信息都写入cookie,在最后付款时从cookie中提取这些信息,当然这里面有了安全和性能问题需要我们考虑了。

四、session与sessionStorage

事实上,两者没有任何关联。
如果要强行联系,也就是两者在名称中都包含"session"这个单词。
一.常见错误观点:
举一个最为典型的错误观点,那就是sessionStorage依赖于Session存储。
这是完全错误的,Session位于服务器端,sessionStorage位于客户端,无任何关联。
(1).Session翻译成汉语具有"会话"的意思,它用于维护HTTP会话状态。
(2).顾名思义,sessionStorage就是"会话期间存储"的意思。
(3).sessionStorage会话周期(生命周期)会在网页选项卡或者浏览器窗口关闭时结束。
二.两者区别总结:

sessionStorage 是 webStorage 的一种, 还有一个是 localStorage; 有些人经常认为是sessionStorage中存session,这个理解也对,也不对。可以说成是:浏览器的window对象中的sessionStorage中存贮着后台的sessionId

(1).sessionStorage存储在客户端,Session在服务器端。
(2).Session主要用户维护会话状态。
(3).sessionStorage则是在会话期间存储相关数据。
但是Session与sessionStorage会话周期是不同的,下面简单介绍如下:
(1).关闭浏览器或者服务器端Session过期,会话结束。
(2).关闭当前选项卡或者浏览器,sessionStorage数据被删除,也就算会话结束。(是不是每一个选项卡就是一个新的会话)
特别说明:在新标签或新浏览器窗口打开一个页面会初始化一个新的会话,即便链接相同也是如此。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值