十、会话状态

2016-01-29 12:19 0 1 收藏

十、会话状态,十、会话状态

【 tulaoshi.com - Java 】

  10.1 会话状态概述

   HTTP协议的“无状态”(Stateless)特点带来了一系列的问题。特别是通过在线商店购物时,服务器不能顺利地记住以前的事务就成了严重的问题。它使得“购物篮”之类的应用很难实现:当我们把商品加入购物篮时,服务器如何才能知道篮子里原先有些什么?即使服务器保存了上下文信息,我们仍旧会在电子商务应用中遇到问题。例如,当用户从选择商品的页面(由普通的服务器提供)转到输入信用卡号和送达地址的页面(由支持SSL的安全服务器提供),服务器如何才能记住用户买了些什么?

   这个问题一般有三种解决方法:

Cookie。利用HTTP Cookie来存储有关购物会话的信息,后继的各个连接可以查看当前会话,然后从服务器的某些地方提取有关该会话的完整信息。这是一种优秀的,也是应用最广泛的方法。然而,即使Servlet提供了一个高级的、使用方便的Cookie接口,仍旧有一些繁琐的细节问题需要处理:
从其他Cookie中分别出保存会话标识的Cookie。
为Cookie设置合适的作废时间(例如,中断时间超过24小时的会话一般应重置)。
把会话标识和服务器端相应的信息关联起来。(实际保存的信息可能要远远超过保存到Cookie的信息,而且象信用卡号等敏感信息永远不应该用Cookie来保存。)
改写URL。你可以把一些标识会话的数据附加到每个URL的后面,服务器能够把该会话标识和它所保存的会话数据关联起来。这也是一个很好的方法,而且还有当浏览器不支持Cookie或用户已经禁用Cookie的情况下也有效这一优点。然而,大部分使用Cookie时所面临的问题同样存在,即服务器端的程序要进行许多简单但单调冗长的处理。另外,还必须十分小心地保证每个URL后面都附加了必要的信息(包括非直接的,如通过Location给出的重定向URL)。如果用户结束会话之后又通过书签返回,则会话信息会丢失。
隐藏表单域。HTML表单中可以包含下面这样的输入域:<INPUT TYPE="HIDDEN" NAME="session" VALUE="...">。这意味着,当表单被提交时,隐藏域的名字和数据也被包含到GET或POST数据里,我们可以利用这一机制来维持会话信息。然而,这种方法有一个很大的缺点,它要求所有页面都是动态生成的,因为整个问题的核心就是每个会话都要有一个唯一标识符。
   Servlet为我们提供了一种与众不同的方案:HttpSession API。HttpSession API是一个基于Cookie或者URL改写机制的高级会话状态跟踪接口:如果浏览器支持Cookie,则使用Cookie;如果浏览器不支持Cookie或者Cookie功能被关闭,则自动使用URL改写方法。Servlet开发者无需关心细节问题,也无需直接处理Cookie或附加到URL后面的信息,API自动为Servlet开发者提供一个可以方便地存储会话信息的地方。

   10.2 会话状态跟踪API

   在Servlet中使用会话信息是相当简单的,主要的操作包括:查看和当前请求关联的会话对象,必要的时候创建新的会话对象,查看与某个会话相关的信息,在会话对象中保存信息,以及会话完成或中止时释放会话对象。

   10.2.1 查看当前请求的会话对象

   查看当前请求的会话对象通过调用HttpServletRequest的getSession方法实现。如果getSession方法返回null,你可以创建一个新的会话对象。但更经常地,我们通过指定参数使得不存在现成的会话时自动创建一个会话对象,即指定getSession的参数为true。因此,访问当前请求会话对象的第一个步骤通常如下所示:
  HttpSession session = request.getSession(true);



   10.2.2 查看和会话有关的信息

   HttpSession对象生存在服务器上,通过Cookie或者URL这类后台机制自动关联到请求的发送者。会话对象提供一个内建的数据结构,在这个结构中可以保存任意数量的键-值对。在2.1或者更早版本的Servlet API中,查看以前保存的数据使用的是getValue("key")方法。getValue返回Object,因此你必须把它转换成更加具体的数据类型。如果参数中指定的键不存在,getValue返回null。

   API 2.2版推荐用getAttribute来代替getValue,这不仅是因为getAttribute和setAttribute的名字更加匹配(和getValue匹配的是putValue,而不是setValue),同时也因为setAttribute允许使用一个附属的HttpSessionBindingListener 来监视数值,而putValue则不能。

   但是,由于目前还只有很少的商业Servlet引擎支持2.2,下面的例子中我们仍旧使用getValue。这是一个很典型的例子,假定ShoppingCart是一个保存已购买商品信息的类:
  HttpSession session = request.getSession(true);
  ShoppingCart previousItems =
    (ShoppingCart)session.getValue("previousItems");
  if (previousItems != null) {
    doSomethingWith(previousItems);
  } else {
    previousItems = new Sho

来源:https://www.tulaoshi.com/n/20160129/1485568.html

延伸阅读
关于对象生命历程的会话 作者:Jim Hyslop 翻译:宋科 出处:C/C++ User Journal 2002 Dec (译者注:我从网上看到这篇文章的原文,非常喜欢作者的写作风格,于是就利用业余时间将它翻译出来,并贴到网上,希望大家可以从中受益,因为我没有和作者或者这篇文章的版权所有者联系以取得这篇文章的版权,所以这...
Mac飞信如何发起群会话 在飞信群组界面群组列表中,双击要会话的群组,打开群会话窗口,在消息输入框中输入消息内容,按Enter键发出群消息。 在群会话时可以点击设置字体快捷图标设置会话字体;点击选择表情快捷图标插入表情。
标签: 电脑入门
qq2013版本中,设置会话消息提醒后,qq闪动的同时还会提前预览到好友发送来的聊天内容,如下图所示。 这一功能还是比较的实用,现在就教大家具体的设置方法。 依次点击系统设置基本设置提醒会话信息提醒即可。
阿里云邮箱会话模式是什么   邮件会话模式便捷地进行项目分类,同一主题和类型的邮件自动在同一个会话里展示。 在邮箱设置-常规设置中将邮件显示方式修改为会话模式,则我们看到的邮箱的显示方式如下:
标签: 电脑入门
您进入QQ空间在‘个人中心’右边‘谁看过我’、‘我看过谁’中将鼠标放在好友的头像上,会弹出该好友的信息资料框,然后点击‘聊天’图标,如图所示:(注:发起临时会话前需要您在电脑上先登录QQ。) 图老师健康网温馨提示:若点击聊天后提示你可以加对方为好友再发起会话,此情况说明该对方QQ号码...

经验教程

290

收藏

80
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部