对session与cookie的一些理解
2008-07-13 14:49
232 查看
对session和cookie的一些理解一、cookie机制和session机制的区别************************************************************************************* 具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。同时我们也看到,由于才服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的,但实际上还有其他选择,比如说重写URL和隐藏表单域。 ************************************************************************************* 二、会话cookie和持久cookie的区别 ************************************************************************************* 如果不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览会话期的cookie被称为会话cookie。会话cookie一般不保存在硬盘上而是保存在内存里。 如果设置了过期时间(setMaxAge(60*60*24)),浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有 效直到超过设定的过期时间。存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存的cookie,不同的浏览器 有不同的处理方式。(在IE下测试通过) ************************************************************************************* 三、如何利用实现自动登录 ************************************************************************************* 当用户在某个网站注册后,就会收到一个惟一用户ID的cookie。客户后来重新连接时,这个用户ID会自动返回,服务器对它进行检查,确定它是否为注册用户且选择了自动登录,从而使用户务需给出明确的用户名和密码,就可以访问服务器上的资源。 ************************************************************************************* 四、如何根据用户的爱好定制站点 ************************************************************************************* 网站可以使用cookie记录用户的意愿。对于简单的设置,网站可以直接将页面的设置存储在cookie中完成定制。然而对于更复杂的定制,网站只需仅将一个惟一的标识符发送给用户,由服务器端的数据库存储每个标识符对应的页面设置。 ************************************************************************************* 五、cookie的发送 ************************************************************************************* 1.创建Cookie对象 2.设置最大时效 3.将Cookie放入到HTTP响应报头 如果你创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie:存储在浏览器的内存中(服务器自动创建一个cookie并将jsessionId作为key,sessionId 的值作为value发送到客户端浏览器内存中),用户退出浏览器之后被删除。如果你希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并 给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。发送cookie需要使用HttpServletResponse的 addCookie方法,将cookie插入到一个Set-Cookie HTTP请求报头中。由于这个方法并不修改任何之前指定的Set-Cookie 报头,而是创建新的报头,因此我们将这个方法称为是addCookie,而非setCookie。同样要记住响应报头必须在任何文档内容发送到客户端之前 设置。 ************************************************************************************* 六、cookie的读取 ************************************************************************************* 1.调用request.getCookie 要获取有浏览器发送来的cookie,需要调用HttpServletRequest的getCookies方法,这个调用返回Cookie对象的数组,对应由HTTP请求中Cookie报头输入的值。 2.对数组进行循环,调用每个cookie的getName方法,直到找到感兴趣的cookie为止,cookie与你的主机(域)相关,而非你的 servlet或JSP页面。因而,尽管你的servlet可能只发送了单个cookie,你也可能会得到许多不相关的cookie。 例如:(login.jsp页面cookie实现用户名userName填写) login.jsp: <% String username = ""; //从客户端读取硬盘中的cookie文件 Cookie[] cookies = request.getCookies(); if(cookies == null){ username = ""; } else{ for (int i = 0; i < cookies.length; i++){ if ("USERNAME".equalsIgnoreCase(cookies.getName())){ username = cookies.getValue(); } } %> <form name="login" method="post" action="login.do"> <td width="100%" bgcolor="#CCCCCC" colspan="2"> <p align="left">用户名<br> <input type="text" name="username" value= "<%=username%>"> </p> <p align="left">密 码 <br> <input type="password" name="password"> </p> <p align="left"> <input type="submit" name="Submit" value="确定"> <input name="reset" type="reset" value="取消"> </p> </form> LoginAction: //将正确userName放入c1对象,并用"USERNAME"做key标识 Cookie c1= new Cookie("USERNAME",logindto.getUsername()); //如果不设置时间,则cookie为会话cookie,不写入客户端硬盘 c1.setMaxAge(60*60*24); response.addCookie(c1); ************************************************************************************* 七、如何使用cookie检测初访者 ************************************************************************************* A.调用HttpServletRequest.getCookies()获取Cookie数组 B.在循环中检索指定名字的cookie是否存在以及对应的值是否正确 C.如果是则退出循环并设置区别标识 D.根据区别标识判断用户是否为初访者从而进行不同的操作 ************************************************************************************* 八、使用cookie检测初访者的常见错误 ************************************************************************************* 不能仅仅因为cookie数组中不存在在特定的数据项就认为用户是个初访者。如果cookie数组为null,客户可能是一个初访者,也可能是由于用户将 cookie删除或禁用造成的结果。但是,如果数组非null,也不过是显示客户曾经到过你的网站或域,并不能说明他们曾经访问过你的servlet。其 它servlet、JSP页面以及非Java Web应用都可以设置cookie,依据路径的设置,其中的任何cookie都有可能返回给用户的浏览器。 正确的做法是判断cookie数组是否为空且是否存在指定的Cookie对象且值正确。 ************************************************************************************* 九、使用cookie属性的注意问题 ************************************************************************************* 属性是从服务器发送到浏览器的报头的一部分;但它们不属于由浏览器返回给服务器的报头。 因此除了名称和值之外,cookie属性只适用于从服务器输出到客户端的cookie;服务器端来自于浏览器的cookie并没有设置这些属性。因而不要 期望通过request.getCookies得到的cookie中可以使用这个属性。这意味着,你不能仅仅通过设置cookie的最大时效,发出它,在 随后的输入数组中查找适当的cookie,读取它的值,修改它并将它存Cookie,从而实现不断改变的cookie值。 ************************************************************************************* 十、如何使用cookie记录各个用户的访问计数 ************************************************************************************* 1.获取cookie数组中专门用于统计用户访问次数的cookie的值 2.将值转换成int型 3.将值加1并用原来的名称重新创建一个Cookie对象 4.重新设置最大时效 5.将新的cookie输出 ************************************************************************************* 十一、session在不同环境下的不同含义 ************************************************************************************* session,中文经常翻译为会话,其本来的含义是指有始有终的一系列动作/消息,比如打电话是从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session。然而当session一词与网络协议相关联时,它又往往隐含了“面向连接”和/或“保持状态”这样两个含义。 session在Web开发环境下的语义又有了新的扩展,它的含义是指一类用来在客户端与服务器端之间保持状态的解决方案。有时候Session也用来指这种解决方案的存储结构。 ************************************************************************************* 十二、session的机制 ************************************************************************************* session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存息。 但程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否包含了一个session标识-称为session id,如果已经包含一个session id则说明以前已经为此客户创建过session,服务器就按照session id把这个session检索出来使用(如果检索不到,可能会新建一个,这种情况可能出现在服务端已经删除了该用户对应的session对象,但用户人为地在请求的URL后面附加上一个JSESSION的参数)。如果客户请求不包含session id,则为此客户创建一个session并且同时生成一个与此session相关联的session id,这个session id将在本次响应中返回给客户端保存。 |
3# 大 中 小 发表于 2008-5-6 17:58 只看该作者 ************************************************************************************* 二十五、session cookie和session对象的生命周期是一样的吗 ************************************************************************************* 当用户关闭了浏览器虽然session cookie已经消失,但session对象仍然保存在服务器端,直到其失效时间。 ************************************************************************************* 二十六、是否只要关闭浏览器,session就消失了 ************************************************************************************* 程序一般都是在用户做log off的时候发个指令去删除session,然而浏览器从来不会主动在关闭之前通知服务器它将要被关闭,因此服务器根本不会有机会知道浏览器已经关闭。服务器会一直保留这个会话对象直到它处于非活动状态超过设定的间隔为止。 之所以会有这种错误的认识,是因为大部分session机制都使用会话cookie来保存session id,而关闭浏览器后这个session id就消失了,再次连接到服务器时也就无法找到原来的session。如果服务器设置的cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP请求报头,把原来的session id发送到服务器,则再次打开浏览器仍然能够找到原来的session。恰恰是由于关闭浏览器不会导致session被删除,迫使服务器为session设置了一个失效时间,当距离客户上一次使用session的时间超过了这个失效时间时,服务器就可以认为客户端已经停止了活动,才会把session删除以节省存储空间。 由此我们可以得出如下结论: 关闭浏览器,只会是浏览器端内存里的session cookie消失,但不会使保存在服务器端的session对象消失,同样也不会使已经保存到硬盘上的持久化cookie消失。 补充:那如何做到在浏览器关闭时删除session呢 ? 严格的讲,做不到这一点。可以做一点努力的办法是在所有的客户端页面里使用javascript代码window.oncolose来监视浏览器的关闭动作,然后向服务器发送一个请求来删除session。但是对于浏览器崩溃或者强行杀死进程这些非常规手段仍然无能为力。 ************************************************************************************* 二十七、打开两个浏览器窗口访问应用程序会使用同一个session还是不同的session ************************************************************************************* 通常session cookie是不能跨窗口使用的,当你新开了一个新的浏览器窗口进入相同页面时,系统会赋予你一个新的session id,这样我们信息共享的目的就达不到了。对session来说是只认id不认人,因此不同的浏览器,不同的窗口打开方式以及不同的cookie存储方式(如会话cookie和持久cookie)都会对这个问题的答案有影响。 (在IE下测试,打开两个浏览器(不是新建窗口,是直接启动两次浏览器),得到的SessionID也是不一样) 要实现跨窗口的会话跟踪,我们可以先把session id保存在persistent cookie中(通过设置session的最大有效时间),然后在新窗口中读出来,就可以得到上一个窗口的session id了,这样通过session cookie和persistent cookie的结合我们就可以实现了跨窗口的会话跟踪。(待测试) ************************************************************************************* 二十八、如何使用会话显示每个客户的访问次数 ************************************************************************************* 由于客户的访问次数是一个整型的变量,但session的属性类型中不能使用int,double,boolean等基本类型的变量,所以我们要用到这些基本类型的封装类型对象作为session对象中属性的值. 但像Integer是一种不可修改(Immutable)的数据结构:构建后就不能更改。这意味着每个请求都必须创建新的Integer对象,之后使用setAttribute来覆盖之前存在的老的属性的值。例如: Integer value = (Integer)request.getSession().getAttribute("cout"); if (value == null){ value = new CountClass(…); // 新创建一个不可更改对象 }else{ value = new CountClass(calculated(value)); // 对value重新计算后创建新的对象 } request.getSession().setAttribute("cout",value);// 使用新创建的对象覆盖原来的老的对象 ************************************************************************************* 二十九、如何使用会话累计用户的数据 ************************************************************************************* 使用可变的数据结构,比如数组、List、Map或含有可写字段的应用程序专有的数据结构。通过这种方式,除非首次分配对象,否则不需要调用setAttribute。例如: List list_check = (List) request.getSession().getAttribute("ids_go"); if(list_check = = null){ list_check = new List(...); request.getSession().setAttribute(("ids_go",list_check ); }else{ list_check .clear();// 如果已经存在该对象则更新其属性而不需重新设置属性 } List list_check1 = (List) request.getSession().getAttribute("ids_go"); System.out.println(list_check1.size());//此时size为0 ************************************************************************************* 三十、不可更改对象和可更改对象在会话数据更新时的不同处理 ************************************************************************************* 不可更改对象因为一旦创建之后就不能更改,所以每次要修改会话中属性的值的时候,都需要调用setAttribute(“someIdentifier”,newValue)来代替原有的属性的值,否则属性的值不会被更新。 可更改对象因为其自身一般提供了修改自身属性的方法,所以每次要修改会话中属性的值的时候,只要调用该可更改对象的相关修改自身属性的方法就可以了,这意味着我们就不需要调用setAttribute方法了。 总结 session机制本身并不复杂,然而其实现和配置上的灵活性却使得具体情况复杂多变。这也要求我们不能把仅仅某一次的经验或者某一个浏览器,服务器的经验当作普遍适用的。 |
相关文章推荐
- session和cookie的一些理解
- 关于Cookie和session的一些理解
- 对session和cookie的一些理解
- 对session和cookie的一些理解
- Java认证:对session和cookie的一些理解
- 对session和cookie的一些理解
- 对session和cookie的一些理解
- 对session和cookie的一些理解
- 对session和cookie的一些理解
- Java认证:对session和cookie的一些理解
- 对session和cookie的一些理解
- 对session和cookie的一些理解
- session和cookie的一些理解
- [转]对session和cookie的一些理解
- 对session和cookie的一些理解
- 对session和cookie的一些理解
- session和cookie的一些理解与分析
- 【J2EE系列】对session和cookie的一些理解
- 对session和cookie的一些理解
- 对session和cookie的一些理解