Cookie与Session详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiaoxiao20121314/article/details/80823036

为什么要使用Cookie或Session?

http是一种无状态的通信协议,为了实现记住状态的功能采用了session和cookie的机制。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。

一、cookie

1、  Cookie就是由服务器发给客户端的特殊信息,而这些信息以文本文件的方式存放在客户端,然后客户端每次向服务器发送请求的时候都会带上这些特殊的信息。具体的步骤是:当客户端第一次请求服务器时,会在服务器的响应头中含有特定的cookie信息,客户端会将此信息保留到本地的一个固定目录下,当客户端再次发请求时会自动将此信息添加到请求头中,服务器会根据客户端的请求头中的cookie信息判别用户的身份,然后响应。例如当我们在登录某一个网站输入密码的弹框中会有一个记住我的小功能框,当勾选后以后就不用在重复的输入密码,此功能就是借助cookie机制实现的。

2、  可以将cookie看成是http协议的一种扩展,http的首部中的set-cookie和cookie字段就是专门为设置和发送cookie而设定的。Cookie信息的建立过程为:客户端发送http请求到服务器,服务器的响应头中包含set-cookie字段,客户端将cookie信息保留,当再次发起请求时会自动携带cookie信息(直到cookie过期),服务器会验证客户端的cookie信息并返回响应。

3、  Cookie的生存周期

1) 如果cookie的生存时间是整个会话期间的话,那么浏览器会将cookie保存在内存中,浏览器关闭时就会自动清除这个cookiemaxAge为负值,表示仅在本窗口及打开的子窗口中有效。

2)  保存在客户端的硬盘中,浏览器关闭的话,该cookie也不会被清除,下次打开浏览器访问对应网站时,这个cookie就会自动再次发送到服务器端。有效期由maxAge设定,在达到此值之前一直有效。可以通过path字段设置cookie的保存和访问的路径,路径字符串必须以“/”结束。

3)  Cookie机制中没有删除机制,所有通过将maxAge设置为0,来是cookie立即过期来达到cookie的及时过期。失效的cookie浏览器会及时从内存中清理掉。

4)  服务器响应中只有一个set-cookie字段进行cookie的操作,所以要想修改指定的cookie,则要新建一个同名的cookie将原来的cookie覆盖掉。而浏览器在提交请求时只会提交名字和value不会提交有效期等其他信息

5)  当要修改或删除cookie时需要建立的新cookie的名字和值与原来的cookie相同,而且处maxAge字段外的其他字段的值也要相同。

4、  Cookie具有域名限制

每种浏览器都只能操作本浏览器的cookie信息,不能跨浏览器操作,实现此功能是借助于域名进行区分的,即使是同一一级域名下的两个子域名,也会认为是两个不同的域名,要想通用可以通过设置domain字段的值来实现(必须以.号开始)

5、 中文属于unicode字符,在内存中占用4个字符,英文字符属于ASCII字符,在内存中占用2个字符,Cookie中使用Unicode字符时要进行相应的编码,否则会显示乱码,一般使用UTF-8编码格式。Cookie中还可以使用二进制数据,使用base64进行二进制编码。

6、 Cookie的常用属性:

1) String namecookie的名字,一旦创建,不可更改。

2) Object valuecookie的值,若字符为Unicode字符则进行字符编码,二进制数据使用BASE64编码

3) Int maxAgeCookie的有效期,单位为秒,若此数值为正数,则当秒数大于此值时过期,当此值为负数时,cookie为临时的值,当关闭浏览器时cookie自动失效,相应的cookie信息也会被清除掉。为0表示删除cookie。默认值为-1.

4) boolean secure:该Cookie是否仅被使用安全协议(httpsssl)传输,默认值为false

5) String path:该Cookie的使用路径。如果设置为“/sessionWeb/”,则只有contextPath为“/sessionWeb”的程序可以访问该Cookie。如果设置为“/”,则本域名下contextPath都可以访问该Cookie。注意最后一个字符必须为“/”。

6) String domain:可以访问该Cookie的域名。如果设置为“.google.com”,则所有以“google.com”结尾的域名都可以访问该Cookie。注意第一个字符必须为“.”。

7) String comment:该Cookie的用处说明。浏览器显示Cookie信息的时候显示该说明。

8) int versionCookie使用的版本号。0表示遵循NetscapeCookie规范,1表示遵循W3CRFC2109规范

9) HTTP-Only 限定只能使用http或https通信时使用cookie,有效的预防了跨站脚本攻击(XSS)。

两个cookie即使name相同如果domain的值不同也会被认为是两个不同的cookie

二、Session(会话)

1、 把客户端浏览器与服务器之间一系列交互的动作称为一个 Session,Session指的是服务器端为客户端所开辟的存储空间,在其中保存的信息就是用于保持状态。

2、  在客户端请求服务器时,服务器会创建session会话,并为此次回话生成唯一的session_id,并将此session_id返回给客户端,当客户端再次发起请求时会带上此session_id,服务器会依据此session_id找到相应的会话,将响应结果返回。

3、  Session的生命周期

服务器一般情况下将session存储在内存中,每一个用户有一个独立的session,在用户第一次访问服务器的时自动创建。只有访问JSP、Servlet等程序时才会创建Session,访问HTML、IMAGE等静态资源并不会创建Session。可以使用request.getSession(true)创建Session。Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session。用户每访问服务器一次,无论是否读写Session,服务器都认为该用户的Session“活跃(active)”了一次。

4、  Session的有效期

为防止内存溢出,服务器会把长时间内没有活跃的Session从内存删除。由maxInactiveInterval属性来设置过期时间,可以通过对应的getMaxInactiveInterval()获取,通过setMaxInactiveInterval(longinterval)修改。也可以在web.xml中修改。Session是建立在cookie的基础上的,所以会产生一种错觉,当浏览器关闭时session_id会失效,然而session_id会一直存储在服务器中,当时间到时才会被清除,但cookie(maxAge小于零)是每次关闭浏览器会清除cookie,则无法找到上次使用的session值,所以需要重新建立session。当cookie是长期有效时,当打开浏览器时可以继续找到之前使用的session。

5、  Session需要使用Cookie作为识别标志,该Cookie为服务器自动生成的,它的maxAge属性一般为–1,表示仅当前浏览器内有效,并且各浏览器窗口间不共享,关闭浏览器就会失效。同一机器的两个浏览器窗口访问服务器时,会生成两个不同的Session。但是由浏览器窗口内的链接、脚本等打开的新窗口(也就是说不是双击桌面浏览器图标等打开的窗口)除外。这类子窗口会共享父窗口的Cookie,因此会共享一个Session。

6、  通过使用URL重定向的功能来使用session功能,即在url中加入session的信息,有两种个方式

1)http://...../xxx;jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764   

2)http://...../xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764

三、Session与cookie的区别

1、  cookie数据存放在客户的浏览器上,session数据放在服务器上

2、  cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session

3、  session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能。考虑到减轻服务器性能方面,应当使用COOKIE;

4、  单个cookie在客户端的限制是3K,一般个数也受浏览器的限制(一般为20个左右)。Session的限制与服务器的内存的大小有关。

猜你喜欢

转载自blog.csdn.net/xiaoxiao20121314/article/details/80823036