原创

【Java服务端开发 二】session和cookie的区别与联系

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-NC-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://tianmaolin.blog.csdn.net/article/details/78019684

转自http://blog.csdn.net/duan1078774504/article/details/51912868

http无状态协议

无状态的HTTP协议:

协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。

HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。

会话(Session)跟踪

会话,指用户登录网站后的一系列动作,比如浏览商品添加到购物车并购买。会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与SessionCookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。

Session

session原理

Session 是存放在服务器端的,类似于Session结构来存放用户数据,当浏览器 第一次发送请求时,服务器自动生成了一个Session和一个Session ID用来唯一标识这个Session,并将其通过响应发送到浏览器。当浏览器第二次发送请求,会将前一次服务器响应中的Session ID放在请求中一并发送到服务器上,服务器从请求中提取出Session ID,并和保存的所有Session ID进行对比,找到这个用户对应的Session。

Session的生命周期

Session存储在服务器端,一般为了放置在服务器的内存中(为了高速存取),Sessinon在用户访问第一次访问服务器时创建,需要注意只有访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建Session,可调用request.getSession(true)强制生成Session。

Session什么时候失效?

  1. 服务器会把长时间没有活动的Session从服务器内存中清除,此时Session便失效。Tomcat中Session的默认失效时间为30分钟。

  2. 调用Session的invalidate方法。

##Session对浏览器的要求
虽然Session保存在服务器,对客户端是透明的,它的正常运行仍然需要客户端浏览器的支持。这是因为Session需要使用Cookie作为识别标志。HTTP协议是无状态的,Session不能依据HTTP连接来判断是否为同一客户,因此服务器向客户端浏览器发送一个名为JSESSIONID的Cookie,它的值为该Session的id(也就是HttpSession.getId()的返回值)。Session依据该Cookie来识别是否为同一用户。

该Cookie为服务器自动生成的,它的maxAge属性一般为-1,表示仅当前浏览器内有效,并且各浏览器窗口间不共享,关闭浏览器就会失效。

为什么session只能显示在一个浏览器

1,根源就在cookie啊,关闭浏览器的时候,会话cookie被关闭,sessionid丢失

2,再次访问的时候由于找不到sessionid只能创建新的sessionid和session因此同一机器的两个浏览器窗口访问服务器时,会生成两个不同的Session。但是由浏览器窗口内的链接、脚本等打开的新窗口(也就是说不是双击桌面浏览器图标等打开的窗口)除外。这类子窗口会共享父窗口的Cookie,因此会共享一个Session。

注意:新开的浏览器窗口会生成新的Session,但子窗口除外。子窗口会共用父窗口的Session。例如,在链接上右击,在弹出的快捷菜单中选择"在新窗口中打开"时,子窗口便可以访问父窗口的Session。所以说Session并没有被销毁,只是我们打开另一个浏览器使用的是一个新的session,我们用新的session而不用旧的,相当于抛弃了它,实际上它还默默的在服务器端活30分钟。相反request和response每次请求后确确实实被销毁了。

禁用cookie如何继续会话跟踪

如果客户端禁用了cookie,通常有两种方法实现session而不依赖cookie。

1)URL重写,就是把sessionId直接附加在URL路径的后面。

2)表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。比如:

Cookie

Cookie工作原理

1, Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器返回一个Cookie(里边放置sessionid)。客户端会把Cookie保存起来。

2, 当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。

Cookie的构成

构成结构

cookie的内容主要包括:名字,值,过期时间,路径和域。路径与域一起构成cookie的作用范围。

1)Name 和 Value 属性由程序设定,默认值都是空引用。(名为JSESSIONID的Cookie,它的值为该Session的id)

2)Domain属性的默认值为当前URL的域名部分,不管发出这个cookie的页面在哪个目录下的。Cookie具有不可跨域名性,就是说,浏览器访问百度不会带上谷歌的cookie。

3)Path属性的默认值是根目录,即 ”/” ,不管发出这个cookie的页面在哪个目录下的。可以由程序设置为一定的路径来进一步限制此cookie的作用范围。

4)Expires 属性,这个属性设置此Cookie 的过期日期和时间。

HttpCookie cookie = new HttpCookie("MyCook");//初使化并设置Cookie的名称
DateTime dt = DateTime.Now;
TimeSpan ts = new TimeSpan(0, 0, 1, 0, 0);//过期时间为1分钟
cookie.Expires = dt.Add(ts);//设置过期时间
cookie.Values.Add("userid", "value");
cookie.Values.Add("userid2", "value2");
Response.AppendCookie(cookie);

Path和Domain属性

path

如果http://www.china.com/test/index.html 建立了一个cookie,那么在http://www.china.com/test/目录里的所有页面,以及该目录下面任何子目录里
的页面都可以访问这个cookie。这就是说,在http://www.china.com/test/test2/test3 里的任何页面都可以访问http://www.china.com/test/index.html建立的cookie。

但是,如果http://www.china.com/test/ 需要访问http://www.china.com/test/index.html设置的cookes,该怎么办?这时,我们要把cookies的path属性设置成“/”。在指定路径的时候,凡是来自同一服务器,URL里有相同路径的所有WEB页面都可以共享cookies。

Domain

比如: http://www.baidu.com/xxx/login.aspx 页面中发出一个cookie,Domain属性缺省就是www.baidu.com ,可以由程序设置此属性为需要的值。值是域名,比如www.china.com。这是对path路径属性的一个延伸。如果我们想让 www.china.com能够访问bbs.china.com设置的cookies,该怎么办? 我们可以把domain属性设置成“china.com”, 并把path属性设置成“/”。

Cookie的应用

发起请求时:浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围(由路径和域决定)大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器。

处理请求时:在服务器端, 一般会对请求头中带的cookie信息做检查(比如说登录检查),如果检查通过,才能进行实际的业务处理。

如果校验不通过,例如没有找到cookie或者cookie信息不正确(可能是伪造),跳转让其登录,然后登录完成之后,在响应中返回cookie信息,浏览器会根据返回的cookie信息,保存在硬盘或者内存中供下次使用。、

JSP中可通过<% java代码 %>方式,把cookie设置到其中。HTML的话需要用JS进行设置和获取。下面展示的是java代码:
设置cookie : 
Cookie mycookie=new Cookie("cookieName",username+"#"+birthday+"#"+mail);      // 新建Cookie      
cookie.setMaxAge(60*60*24*365);           // 设置生命周期,单位秒
response.addCookie(mycookie);              // 输出到客户端
 
接收cookie:
String[] info =new String[]{ "", "", ""};
Cookie[] cook=request.getCookies();
If(cook!=null){
for(int i=0; i<cook.length; i++){
if(cook[i].getName().equals("cookieName")){
info = cook[i].getValue().split("#")   
  }
}
// 最后通过info[0]、info[1]、Info[2]这种方式获取cookie中存储的值。

Cookie的生命周期

会话Cookie和持久Cookie

1,**若不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失。**这种生命期为浏览器会话期的cookie被称为会话cookie。会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。

2,若设置了过期时间,浏览器就会把cookie保存到硬盘上关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在浏览器的不同进程间共享。这种称为持久Cookie。

Session和Cookie的区别

保存位置稍有区别

cookie数据存放在客户的浏览器上,session数据放在服务器上(sessionid在客户端内存上也存在)。

服务器压力的不同

session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,**考虑到减轻服务器性能方面,应当使用cookie。**因而像Google、Baidu、Sina这样并发访问量极高的网站,是不太可能运用Session来追踪客户会话的。考虑到减轻服务器性能方面,应当使用COOKIE。

###cookie的保存内容大小有限制
单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

###安全性不同
cookie安全性不如session。因为普通cookie保存在本地硬盘上,黑客可以伪造url等方式发起xss攻击,获取本地硬盘保存状态的cookie,进而窃取用户的敏感信息。

session则不同,只有在用户登录此网站时发起xss攻击才能获取session信息,关闭浏览器之后,session即被销毁,安全性较cookie要好可以考虑将登陆信息等重要信息存放为session,其他信息如果需要保留,可以放在cookie中。

cookie的保存内容大小有限制

单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

存储的数据类型不同

Cookie中只能保管ASCII字符串,假如需求存取Unicode字符或者二进制数据,需要先进行编码。Cookie中也不能直接存取Java对象。若要存储略微复杂的信息,运用Cookie是比较艰难的。而Session中能够存取任何类型的数据,包括而不限于String、Integer、List、Map等。Session中也能够直接保管Java Bean乃至任何Java类,对象等,运用起来十分便当。能够把Session看做是一个Java容器类。

注意:Session实现会话跟踪,存放sessionid,并不是一定要使用cookie,cookie只是其实现的一种手段。session还可以使用url,隐藏式提交sessionid来完成。

只使用cookie是将数据存到本地(服务器存在cookie里返回到客户端),所以安全性差。但可以长时间保存。

文章最后发布于: 2017-09-18 15:29:31
展开阅读全文
0 个人打赏
私信求帮助

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: Age of Ai 设计师: meimeiellie

分享到微信朋友圈

×

扫一扫,手机浏览