上次在验收ITOO的时候,师姐很多次提到了Session和Cookie,之前也接触到很多Session和Cookie,就是没有细细研究对比,所以对这两个知识点很不了解。想叫师姐给我讲讲这两个知识点,可是师姐说这个东西你不需要了解,知道就行。可是总觉得不研究不行,查了一下午的资料,总算是了解了一些。所以还是来个总结,收获才会比较多。
Session是一种服务器端的信息管理机制,它把这些文件信息以文件的形势存放在服务器的硬盘空间上(现在才知道为什么服务器的硬件配置要求为什么这么高了!!)。不过,这种情况是默认的,可以用memcache把这种数据放到内存里面(这又是不一样的技术了)。
当客户端向服务发出请求时,会要求服务端产生一个Session,服务器会首先检查这个客户端的请求是否已包含了一个Session 标识,称为Sessionid,如果已包含则说明以前为此客户端创建Session,服务器就按照Sessionid把这个Session检索出来使用,如果检索不到,会新建一个。服务器会把长时间没有活动的Session从服务器内存中清除,此时Session便失效时间为20分钟。有时候我们关闭一个网站,几分钟后又打开它,发现我们的账号还是处于登录状态,这个大概就是通过Session实现的吧。如果客户端请求不包含Sessionid,则为此客户端创建一个Session并且声成一个与此Session相关联的Session id,Sessionid的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个Session id将被在本次响应中返回给客户端保存。保存这个Sessionid的方式可以采用cookie,在交互过程浏览器可以自动的按照规则则把这个标识发送给服务器。这样可以减轻服务器的负担,提高服务器性能。但cookie可以被人为的禁止,或不支持cookie,如在手机端,很多手机浏览器都不支持cookie,这个时候则必须有其他机制以便在cookie被禁止是仍然能够把Sessionid传递回服务器。这个时候就会经常用到师姐提到的URL地址重写。
URL地址重写是对客户端不支持cookie的解决方案,URL地址重写的原理是将用户Session的id信息重写到URL路径的后面,服务器能够解析重写后的URL获取的Session的id。这样即使客户端不支持cookie,也可以使用Session来记录用户状态。HttpServletResponse类提供了enCodeURL(Stringurl)实现URL地址重写,此方法会自动判断客户端是否支持cookie。如果客户端支持,会将URL原封不动地输出来,如果客户端不支持cookie,则会将用户Session的id重写到URL中。但是,如果是第一次请求是不会带任何cookie,如果客户端支持cookie,URL地址重写后的地址中仍然会带有jsessionid,第二次访问时服务器就不会带有jsessionid了。
对于客户端不支持cookie的问题还有另一种解决方法,就是表单隐藏字段,就是服务器自动修改表单,添加隐藏字段,以便在表单提交时能够把Sessionid传递回服务器。
“Session”的翻译是”开会“。开会就意味着信息的交流。顾名思义也就是客户端与服务端的会议,客户端提要求,服务端给服务。
Session存储在服务端,一般为了防止在服务器的内存中,Session在用户访问服务是创建,只有访问JSP,Servlet等程序时才会创建Session,如果只访问HTML、IMAGE等静态资源是不会创建Session,需要调用request.getSession(true)强制生成Session。
当我们浏览网站的时候,web服务器会发一些资料在我们的计算机上,Cookie会帮我们在网站上所打的文字或是一些选择都记录下来。当我们下次再浏览同一个网站是,web服务器会先看看有没有它上次留下的cookie资料,有的话,就会依据cookie里的内容来判断使用者,送出特点的网页给我们。
cookie机制采用的是客户端保持状态的方案,是客户端的会话状态的一种存储机制。它是服务器在本地机器上存储的小段文本或者是内存中的一段数据,并随每一个请求发送至同一个服务器。和Session一样,也需要一个标识,所以Session机制需要借助cookie机制来达到保持标识的目的,这样可以解决http协议无状态的缺陷。
正统的cookie分发是通过扩展Http协议来实现得,服务器通过在Http的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie。纯粹的客户端脚本如JavaScript或VBScript也可以生成cookie。cookie的使用是由浏览器按照一定的原则在后台自动发送给服务器。浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把改cookie附在请求资源的http请求上发送个服务器。
cookie的主要内容包括:名字,值,过期时间,路径和域。路径和域一起构成cookie的作用范围。如果不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就会消失。这种生命期为浏览器会话期的cookie被称为会话cookie。会话cookie一般不存储在硬盘上而是保存在内存里。如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效,直到超过设定的过期时间。并且,存储在硬盘上的cookie可以在不同的浏览器进程间共享。
1、Session数据放在服务器上,cookie数据放在客户的浏览器上。
2、Session比cookie安全。
3、Session会在一定时间内保存在服务器上,当访问增多,会占用服务器的性能,使用cookie会减轻服务器的负担,提高服务器的性能。
4、单个cookie保存的数据不能超过4k,很多浏览器都限制一个站点最多保存20个cookie。
其实Session和cookie的搭配是很好的,就像在开会(Session)的时候饿了来点饼干(cookie)充饥,补充能量,才能让会议更好的进行。下面的图可以很清楚的说明利用cookie管理Session。