SEESION机制和cookies

Cookies和Session都是用于记录服务器与客户端通信的一些相关信息的工具,cookies存在于客户端,session存在于服务器。存在这些工具的原因,由于HTTP协议是无状态协议,在经过三次握手建立连接后,数据传输完毕后,释放连接,当再次建立与服务器连接时候,服务器需要再次确定连接对象,于是cookies和session变应运而出。

  1. Cookies

    客户端请求服务器,服务器给客户端(浏览器)颁发cookies,可以包含用户登录状态,登录账号密码以及一些用户使用信息。相当于服务器将一些与用户交互的信息写入客户端。浏览器访问网站只会携带相应的cookies,这又浏览器自己来保证实现。PS:Cookies是服务器保存在客户端上的一些数据文件。

     浏览器能够保证Google只会操作Google的Cookie而不会操作Baidu的Cookie,从而保证用户的隐私安全。浏览器判断    一个网站是否能操作另一个网站Cookie的依据是域名。Google与Baidu的域名不一样,因此Google不能操作Baidu的      Cookie。虽然网站images.google.com与网站www.google.com同属于Google,但是域名不一样,二者同样不能互相操作彼此的Cookie。

PS:用户登录网站www.google.com之后会发现访问images.google.com时登录信息仍然有效,而普通的Cookie是做不到的。这是因为Google做了特殊处理。本章后面也会对Cookie做类似的处理。

虽然Cookies常做了加密处理,但是如果盗取了浏览器短的cookies,就可以骗取服务器信任,所以cookies并不是那么安全。

 2.Session    

        Session存在于服务器端,记录用户登录状态,使用信息等。当然,会加大服务器的存储压力。Session依赖于客户端的cookies来协同运行。客户端第一次请求服务器,服务器会检查session id,没有的话就会分配一个,并且返回到浏览器以cookies保存。Session依据该Cookie来识别是否为同一用户。该Cookie为服务器自动生成的,它的maxAge属性一般为–1,表示仅当前浏览器内有效,并且各浏览器窗口间不共享,关闭浏览器就会失效。

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

PS:新开的浏览器窗口会生成新的Session,但子窗口除外。子窗口会共用父窗口的Session。例如,在链接上右击,在弹出的快捷菜单中选择“在新窗口中打开”时,子窗口便可以访问父窗口的Session。

如果客户端浏览器将Cookie功能禁用,或者不支持Cookie怎么办?Java Web提供了另一种解决方案:URL地址重写。

Example:

<td>

    <a href="<%=response.encodeURL("index.jsp?c=1&wd=Java") %>"> 
    Homepage</a>

</td>

该方法会自动判断客户端是否支持Cookie。如果客户端支持Cookie,会将URL原封不动地输出来。如果客户端不支持Cookie,则会将用户Session的id重写到URL中。重写后的输出可能是这样的:

<td>

    <ahref="index.jsp;jsessionid=0CCD096E7F8D97B0BE608AFDC3E1931E?c=
    1&wd=Java">Homepage</a>

</td>即在文件名的后面,在URL参数的前面添加了字符串“;jsessionid=XXX”。其中XXX为Session的id。分析一下可以知道,增添的jsessionid字符串既不会影响请求的文件名,也不会影响提交的地址栏参数。用户单击这个链接的时候会把Session的id通过URL提交到服务器上,服务器通过解析URL地址获得Session的id。

PS:服务器将输出的Html全部重写,加入session Id,这样客户端请求就会自动提交上SessionID,解决cookies的使用。





你可能感兴趣的:(SEESION机制和cookies)