壮态管理
当用户在发送一个请求关得到返回信息之后,客户端与服务器端之间的网络连接就已经断开了,在下一个请求发送时,服务器无法确定这次请求和上次的请求是否来自同一个客户端。也就是说,服务器不能记住"记住"用户,这是hptp协议的限制。在web应用程序中,实际上是经常需要记住每次请求的。那么,如何让服务器知道不同的请求是否来自同一个客户端,就是状态管理问题出现了session和cookie。
两者区别:
1、session保存在服务器,客户端不知道其中的信息;cookie保存在客户端,服务器能够知道其中的信息。
2、session中保存的是对象,cookie中保存的是字符串。
3、session不能区分路径,同一个用户在访问一个网站期间,所有的session在任何一个地方都可以访问到。而cookie中如果设置 了路径参数,那么同一个网站中不同路径下的cookie互相是访问不到的。
4、session默认需要借助cookie才能正常工作。如果客户端完全禁止cookie,session,这种方法将失效。但是如果服务器端启用了url编码,也就是用URLEncoder.encode("index.jsp?id=3","UTF-8");..把所有的url编码了,则会在url后面出现如下类似的东西index.jsp:jsessionid=fdsaffjdlksfd124324lkdjsf?id=3服务器通过这个进行session的判断。
5 session在用户会话结束后就会关闭了,但cookie因为保存在客户端,可以长期保存
6 cookie:是服务端向客户端写入的小的片段信息。cookie信息保存在服务器缓存区,不会在客户端显现。当你第一次登陆一个网站,服务器向你的机器写得片段信息。你可以在Internet选项中找到存放cookie的文件夹。如果不删除,cookie就一直在这个文件夹中。
安全性:
就个人而言,我觉得session更安全一点,我以下几点看法。
1,如果session和cookie一样安全的话,二者就没有并要同时存在了,只要cookie就好了,让客户端来分提服务器的负担,并且对于用户来说又是透明的。何乐而不为呢。
2,session的sessionID是放在cookie里,要想功破session的话,第一要功破cookie。功破cookie后,你要得到 sessionID,sessionID是要有人登录,或者启动session_start才会有,你不知道什么时候会有人登录。第二,sessionID是加密的,session是针对某一次通信而言,会话结束session也就随着消失了,而真正的cookie存在于客户端硬盘上的一个文本文件,谁安全很显然了。
两者性能分析:
首先说二者的性能,cookie存在客户端,而session是在服务器端保存着的,以文件或者数据库的形式。当一个网站的用户量非常大时,我想众多的网站架构师是不会采用session的,因为这需要耗费服务器非常大的资源,导致服务器性能很低。(但不排除存在有效的解决办法)。cookie存在客户端,使用cookie的话就把资源耗费分散到各个地方,降低了网站成本。(虽然说有的用户禁用cookie,但这是少数,设计时可以忽略掉),我选用cookie。
关于选定cookie后的安全问题,我有自己的解决办法,在用户登陆的时候比如要存一个uid(并不是唯一选择,可以是username),用来记录用户的登陆信息,这时在 setcookie时,可以存两个关于uid的cookie,一个是 原始 的 uid,直接存,另一个 secureuid 的值(value),将 uid的值使用某种方法加密,比如加密为md5($uid . 'admin'),每次用户要进行需要权限的操作时,对 uid 是否为 null 并且 cookie uid 加密后的值是否等于secureuid的值。 为什么要这样验证: a .验证为空,看用户是否具有本网站的cookie信息,如果有的话, b. 需要继续判断, 因为 cookie可以仿造, 这种攻击方法很常见,md5加密的信息,我想用户是很难仿造出来的。这很重要。
另外:完了说明: 一个域名在用户的浏览器保存的cookie是有限的,最多为5个(一般情况),有的是3个。一个浏览器保存的cookie个数是100个(一般情况),少的为60个
解决方案:
如果用户登录了,保存用户信息到cookie中。同时生成用户对象的session。
当验证登录时,先从session中找用户,如果session中找到用户,说明已经登录,直接使用此用户对象,如果session中找不到,再从cookie中找用户信息(用户名和密码),如果cookie中有,则查询数据库,再生成相应的session,如果没有,就让用户手动登录。
数据库中用户的密码使用md5(你也可以使用特定的算法加密码,甚至直接用明文),用户信息可以把用户名,md5加密后的密码保存到cookie中。
也可以在cookie中只保存session的ID,然后用户名与密码保存在持久的session中,不过Java中通过session id取得session好像不是太容易,我使用Servlet和Struts2时是这样,就没用这种方式了,不想麻烦。