您的位置:首页 > 理论基础 > 计算机网络

cookie与session(下) 转载 原文链接http://blog.sina.com.cn/s/blog_4745d1c10100ihnq.html

2012-01-12 00:20 274 查看
十五、session何时被删除

*************************************************************************************

session在下列情况下被删除:

A.程序调用HttpSession.invalidate()

B.距离上一次收到客户端发送的session id时间间隔超过了session的最大有效时间

C.服务器进程被停止

再次注意关闭浏览器只会使存储在客户端浏览器内存中的session cookie失效,不会使服务器端的session对象失效。

*************************************************************************************

十六、URL重写有什么缺点

*************************************************************************************

   对所有的URL使用URL重写,包括超链接,form的action,和重定向的URL。每个引用你的站点的URL,以及那些返回给用户的URL(即使通过间接手段,比如服务器重定向中的Location字段)都要添加额外的信息。

   这意味着在你的站点上不能有任何静态的HTML页面(至少静态页面中不能有任何链接到站点动态页面的链接)。因此,每个页面都必须使用 servlet或JSP动态生成。即使所有的页面都动态生成,如果用户离开了会话并通过书签或链接再次回来,会话的信息都会丢失,因为存储下来的链接含有错误的标识信息-该URL后面的SESSION ID已经过期了。  

*************************************************************************************

十七、使用隐藏的表单域有什么缺点

*************************************************************************************

仅当每个页面都是有表单提交而动态生成时,才能使用这种方法。单击常规的<A HREF..>超文本链接并不产生表单提交,因此隐藏的表单域不能支持通常的会话跟踪,只能用于一系列特定的操作中,比如在线商店的结账过程

*************************************************************************************

十八、会话跟踪的基本步骤

*************************************************************************************

1.访问与当前请求相关的会话对象

2.查找与会话相关的信息

3.存储会话信息

4.废弃会话数据

*************************************************************************************

十九、getSession()/getSession(true)、getSession(false)的区别

*************************************************************************************

getSession()/getSession(true):当session存在时返回该session,否则新建一个session并返回该对象

getSession(false):当session存在时返回该session,否则不会新建session,返回null

*************************************************************************************

二十、如何将信息于会话关联起来

*************************************************************************************

  setAttribute会替换任何之前设定的值;如果想要在不提供任何代替的情况下移除某个值,则应使用removeAttribute。这个方法会触发所有实现了HttpSessionBindingListener接口的值的valueUnbound

方法。

*************************************************************************************

二十一、会话属性的类型有什么限制吗

*************************************************************************************

通常会话属性的类型只要是Object就可以了。除了null或基本类型,如int,double,boolean。

如果要使用基本类型的值作为属性,必须将其转换为相应的封装类对象

*************************************************************************************

二十二、如何废弃会话数据

*************************************************************************************

A.只移除自己编写的servlet创建的数据:

调用removeAttribute(“key”)将指定键关联的值废弃

B.删除整个会话(在当前Web应用中):

调用invalidate,将整个会话废弃掉。这样做会丢失该用户的所有会话数据,而非仅仅由我们

servlet或JSP页面创建的会话数据

C.将用户从系统中注销并删除所有属于他(或她)的会话

调用logOut,将客户从Web服务器中注销,同时废弃所有与该用户相关联的会话(每个Web应用至多一个)。这个操作有可能影响到服务器上多个不同的Web应用

*************************************************************************************

二十三、使用isNew来判断用户是否为新旧用户的错误做法

*************************************************************************************

public boolean isNew()方法如果会话尚未和客户程序(浏览器)发生任何联系,则这个方法返回true,这一般是因为会话是新建的,不是由输入的客户请求所引起的。

但如果isNew返回false,只不过是说明他之前曾经访问该Web应用,并不代表他们曾访问过我们的servlet或JSP页面。

因为session是与用户相关的,在用户之前访问的每一个页面都有可能创建了会话。因此isNew为false只能说用户之前访问过该Web应用,session可以是当前页面创建,也可能是由用户之前访问过的页面创建的。

正确的做法是判断某个session中是否存在某个特定的key且其value是否正确

*************************************************************************************

二十四、Cookie的过期和Session的超时有什么区别

*************************************************************************************

会话的超时由服务器来维护,它不同于Cookie的失效日期。首先,会话一般基于驻留内存的cookie

不是持续性的cookie,因而也就没有截至日期。即使截取到JSESSIONID cookie,并为它设定一个失效日期发送出去。浏览器会话和服务器会话也会截然不同。

*************************************************************************************

二十五、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还是不同的session

*************************************************************************************

通常session cookie是不能跨窗口使用的,当你新开了一个浏览器窗口进入相同页面时,系统会赋予你一个新的session id,这样我们信息共享的目的就达不到了。

此时我们可以先把session id保存在persistent cookie中(通过设置session的最大有效时间),然后在新窗口中读出来,就可以得到上一个窗口的session id了,这样通过session cookie和persistent cookie的结合我们就可以实现了跨窗口的会话跟踪。

*************************************************************************************

二十八、如何使用会话显示每个客户的访问次数

*************************************************************************************

由于客户的访问次数是一个整型的变量,但session的属性类型中不能使用int,double,boolean等基本类型的变量,所以我们要用到这些基本类型的封装类型对象作为session对象中属性的值

  但像Integer是一种不可修改(Immutable)的数据结构:构建后就不能更改。这意味着每个请求都必须创建新的Integer对象,之后使用setAttribute来代替之前存在的老的属性的值。例如:

HttpSession session = request.getSession();

SomeImmutalbeClass value = (SomeImmutableClass)session.getAttribute(“SomeIdentifier”);

if (value= =null){

value = new SomeImmutableClass(…); // 新创建一个不可更改对象

}else{

value = new SomeImmutableClass(calculatedFrom(value)); // 对value重新计算后创建新的对象

}

session.setAttribute(“someIdentifier”,value); // 使用新创建的对象覆盖原来的老的对象

*************************************************************************************

二十九、如何使用会话累计用户的数据

*************************************************************************************

使用可变的数据结构,比如数组、List、Map或含有可写字段的应用程序专有的数据结构。通过这种方式,除非首次分配对象,否则不需要调用setAttribute。例如

HttpSession session = request.getSession();

SomeMutableClass value = (SomeMutableClass)session.getAttribute(“someIdentifier”);

if(value = = null){

value = new SomeMutableClass(…);

session.setAttribute(“someIdentifier”,value);

}else{

value.updateInternalAttribute(…); // 如果已经存在该对象则更新其属性而不需重新设置属性

}

*************************************************************************************

三十、不可更改对象和可更改对象在会话数据更新时的不同处理

*************************************************************************************

不可更改对象因为一旦创建之后就不能更改,所以每次要修改会话中属性的值的时候,都需要

调用setAttribute(“someIdentifier”,newValue)来代替原有的属性的值,否则属性的值不会被更新

可更改对象因为其自身一般提供了修改自身属性的方法,所以每次要修改会话中属性的值的时

候,只要调用该可更改对象的相关修改自身属性的方法就可以了。这意味着我们就不需要调

用setAttribute方法了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐