第9章使用会话追踪(sessiontracking)9.1会话与会话追踪Internet通信协议可以分为两大类:有连接协议和无连接协议,两者的最大差别在于客户端和服务器端之间维持联机上的不同。session的引入:鉴于http是无状态的协议,当完成客户端和服务器的传递信息后,就断开之间的联系,这样就造成了怎么样在几个页面之间传递信息的问题.我们Jsp程序中很多参数需要从数据库中读取,有的参数实际读取一次就可以,如果设计成每个用户每产生一个页面都要读取数据库,很显然,数据库的负载很大,同时也浪费时间,虽然可能有数据库连接池优化,但是尽量少使用数据库是我们编程的原则.Session,中文经常翻译为“会话”。sessiontracking(会话追踪)是指一类用来客户端与服务器之间保持状态的解决方案,简单地说,当一个客户在多个页面间切换时,服务器会保存该用户的信息。9.2实现会话追踪的4种方式(1)使用持续Cookies(PersistentCookie)(2)使用包含额外参数的URL(URLRewriting)。(3)建立含有数据的隐藏表单字段(HiddenFormField)。(4)使用内建session对象。相对于安全级别来说第四种最高了,session是指在一段时间内客户端和服务器之间的一连串的相关的交互过程。下面这段代码先将会话信息记录在HashMap中,保存在服务器端,并用sessionID标识,然后把sessionID保存在名为“JSESSIONID”的Cookie中。用户请求到达服务器后,先从Cookie中取出sessionID,然后从HashMap中取出会话信息。这样就实现了会话追踪。虽然Cookie强大且持续性高,但是由于有些用户因为担心Cookie对个人隐私的威胁,会关闭Cookie,一旦如此,便无法利用Cookie来达到会话追踪的功能。9.2.1使用CookieCookie是一个小小的文本文件,它是将会话信息记录在这个文本文件内,每个页面都去Cookie中提取以前的会话信息StringsessionID=makeUniqueString();//是用来产生唯一的sessionidHashMapsessionInfo=newHashMap();HashMapglobaTable=findTableStoringSessions();globeTable.put(sessionID,sessionInfo);CookiesessionCookie=newCookie("JSESSION",sessionID);sessionCookiesetPath(“/”);response.addCookie(sessionCookie);9.2.2URL重写URL重写是利用GET的方法,在URL的尾部添加一些额外的参数来达到会话追踪(sessiontracking)的目的,服务器将这个标识符与它所存储的有关会话的数据关联起来。URL看起来如下:http://host/path/file.html;jsessionid=1234,使用URL重写的优点是Cookie被禁用或者根本不支持的情况下依旧能够工作。但也有很多缺点:必须对所有指向您的网站的URL进行编码。所有页面必须动态生成。不能使用预先记录下来的URL进行访问,或者从其他网站链接进行访问。9.2.3隐藏表单字段隐藏表单字段的方法,是利用HTML内Hidden的属性,把客户端的信息,在用户不察觉的情形下,偷偷地随着请求一起传送给到服务器处理,这样一来,就可以进行会话跟踪的任务了。可以下列的方法来做隐藏表单字段的会话追踪。9.2.4使用内建session对象传统的会话追踪方式使用比较麻烦,JSP使用内建的session对象可以非常方便地实现会话追踪,JSP的会话机制基于Cookie或URL重写技术,融合了这两种技术的优点,当客户端允许使用Cookie时,内建session对象使用Cookie进行会话追踪,如果客户端禁用Cookie,则选择使用URL重写。(1)获取session对象例如把购物车作为属性存储在session中,在其他JSP页面中可以通过session再获得购物车。//在JSP页面中可以直接使用sessionShoppingCartcart=(ShoppingCart)session.getAttribute("cart");内建的session对象是javax.servlet.http.HttpSession类的实例,如果在JavaBean或者Servlet中使用session就需要先从当前的request对象中取得,例如://得到用户session和购物篮HttpSessionsession=request.getSession();ShoppingCartcart=(ShoppingCart)session.getAttribute("cart");(2)读写session中的数据向session中存入对象使用setAttribute方法,通过getAttribute方法读取对象。从se...