1 / 41

张孝祥 IT 课堂 - 深入体验 Java Web 开发内幕

张孝祥 IT 课堂 - 深入体验 Java Web 开发内幕. WEB 应用中的会话与会话状态 Cookie 在 Servlet 程序中使用 Cookie Session Session 的典型案例 Session 的持久化管理. 第 7 讲 会话与状态管理. 在日常生活中,从拨通电话到挂断电话之间的一连串的你问我答的过程就是一个会话。 WEB 应用中的会话是指一个客户端浏览器与 WEB 服务器之间连续发生的一系列请求和响应过程。

cedric
Download Presentation

张孝祥 IT 课堂 - 深入体验 Java Web 开发内幕

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 张孝祥IT课堂-深入体验Java Web开发内幕 IT资讯交流网 WWW.IT315.ORG

  2. WEB应用中的会话与会话状态 Cookie 在Servlet程序中使用Cookie Session Session的典型案例 Session的持久化管理 第7讲 会话与状态管理 IT资讯交流网 WWW.IT315.ORG

  3. 在日常生活中,从拨通电话到挂断电话之间的一连串的你问我答的过程就是一个会话。在日常生活中,从拨通电话到挂断电话之间的一连串的你问我答的过程就是一个会话。 WEB应用中的会话是指一个客户端浏览器与WEB服务器之间连续发生的一系列请求和响应过程。 WEB应用的会话状态是指WEB服务器与浏览器在会话过程中产生的状态信息,借助会话状态,WEB服务器能够把属于同一会话中的一系列的请求和响应过程关联起来。 会话与会话状态简介 IT资讯交流网 WWW.IT315.ORG

  4. 如何实现有状态的会话 • 某个用户从网站的登录页面登入后,再进入购物页面购物时,负责处理购物请求的服务器程序必须知道处理上一次请求的程序所得到的用户信息。 • HTTP协议是一种无状态的协议,WEB服务器本身不能识别出哪些请求是同一个浏览器发出的 ,浏览器的每一次请求都是完全孤立的。 • WEB服务器端程序要能从大量的请求消息中区分出哪些请求消息属于同一个会话,即能识别出来自同一个浏览器的访问请求,这需要浏览器对其发出的每个请求消息都进行标识,属于同一个会话中的请求消息都附带同样的标识号,而属于不同会话的请求消息总是附带不同的标识号,这个标识号就称之为会话ID(SessionID)。 • 会话ID可以通过一种称之为Cookie的技术在请求消息中进行传递,也可以作为请求URL的附加参数进行传递。会话ID是WEB服务器为每客户端浏览器分配的一个唯一代号,它通常是在WEB服务器接收到某个浏览器的第一次访问时产生,并且随同响应消息一道发送给浏览器。 • 会话过程由WEB服务器端的程序开启,一旦开启了一个会话,服务器端程序就要为这个会话创建一个独立的存储结构来保存该会话的状态信息,同一个会话中的访问请求都可以且只能访问属于该会话的存储结构中的状态信息。 IT资讯交流网 WWW.IT315.ORG

  5. 什么是Cookie • Cookie是一种在客户端保持HTTP状态信息的技术,它好比商场发放的优惠卡。 • Cookie是在浏览器访问WEB服务器的某个资源时,由WEB服务器在HTTP响应消息头中附带传送给浏览器的一片数据,WEB服务器传送给各个客户端浏览器的数据是可以各不相同的。 • 一旦WEB浏览器保存了某个Cookie,那么它在以后每次访问该WEB服务器时,都应在HTTP请求头中将这个Cookie回传给WEB服务器。 • WEB服务器通过在HTTP响应消息中增加Set-Cookie响应头字段将Cookie信息发送给浏览器,浏览器则通过在HTTP请求消息中增加Cookie请求头字段将Cookie回传给WEB服务器。 • 一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。 • 一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie。 • 浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。 IT资讯交流网 WWW.IT315.ORG

  6. Cookie的传送过程示意图 WEB Server1 ②第一次访问请求 ①第一次访问不存在 Server1的Cookie 浏览器 ③第一次响应 Set-Cookie2: name=value Cookie存储区 ④写入Server1 的Cookie ⑥后续访问请求 Cookie: name=value Server1 的Cookie WEB Server2 ⑤后续访问存在 Server1的Cookie Server2 的Cookie IT资讯交流网 WWW.IT315.ORG

  7. Set-Cookie2头字段用于指定WEB服务器向客户端传送的Cookie内容,但是按照Netscape规范实现Cookie功能的WEB服务器,使用的是Set-Cookie头字段,两者的语法和作用类似。 Set-Cookie2头字段中设置的cookie内容是具有一定格式的字符串,它必须以Cookie的名称和设置值开头,格式为“名称=值”,后面可以加上0个或多个以分号(;)和空格分隔的其它可选属性,属性格式一般为“属性名=值”。 举例:Set-Cookie2: user=it315; Version=1; Path=/ 除了“名称=值”对必须位于最前面外,其它的可选属性的先后顺序可以任意。 Cookie的名称只能由普通的英文ASCII字符组成,浏览器不用关心和理解Cookie的值部分的意义和格式,只要WEB服务器能理解值部分的意义就行。 大多数现有的WEB服务器都是采用某种编码方式将值部分的内容编码成可打印的ASCII字符,RFC 2965规范中没有明确限定编码方式。 Set-Cookie2响应头字段 IT资讯交流网 WWW.IT315.ORG

  8. Set-Cookie2头字段中的属性 • Comment=value • Discard • Domain=value 例如:Set-Cookie2: user=it315; Version=1; Path=/; Domain=.it315.org • Max-Age=value • Path=value • Port[="portlist"] • Secure • Version=value 多想一想:如果浏览器接收到两个名称完全相同的Cookie,后面接收的Cookie是否会替换前面接收的Cookie IT资讯交流网 WWW.IT315.ORG

  9. Cookie请求头字段 • 浏览器使用Cookie请求头字段将Cookie信息回送给WEB服务器。 • 多个Cookie信息通过一个Cookie请求头字段回送给WEB服务器。 • 浏览器根据下面的几个规则决定是否发送某个Cookie信息: • 请求的主机名是否与某个存储的Cookie的Domain属性匹配; • 请求的端口号是否在该Cookie的Port属性列表中; • 请求的资源路径是否在该Cookie的Path属性指定的目录及子目录中; • 该Cookie的有效期是否已过。 • Cookie请求头字段中的每个Cookie之间用逗号(,)或分号(;)分隔。 • 在Cookie请求头字段中除了必须有“名称=值”的设置外,还可以有Version、Path、Domain、Port等几个属性。 • 在Version、Path、Domain、Port等属性名之前,都要增加一个“$”字符作为前缀。 • Version属性只能出现一次,且要位于Cookie请求头字段设置值的最前面,如果需要设置某个Cookie信息的 Path、Domain、Port等属性,它们必须位于该Cookie信息的“名称=值”设置之后。 • Path属性指向子目录的Cookie排在Path属性指向父目录的Cookie之前。 举例:Cookie: $Version=1; Course=Java; $Path=/it315/lesson; Course=vc; $Path=/it315 IT资讯交流网 WWW.IT315.ORG

  10. 在Servlet程序中使用Cookie • Servlet API中提供了一个javax.servlet.http.Cookie类来封装Cookie信息,它包含有生成Cookie信息和提取Cookie信息的各个属性的方法。 • Cookie类的方法: • 构造方法: public Cookie(java.lang.String name,java.lang.String value) • getName方法 • setValue与getValue方法 • setMaxAge与getMaxAge方法 • setPath与getPath方法 • setDomain与getDomain方法 • setVersion与getVersion方法 • setComment与getComment方法 • setSecure与getSecure方法 • HttpServletResponse接口中定义了一个addCookie方法,它用于在发送给浏览器的HTTP响应消息中增加一个Set-Cookie响应头字段。 • HttpServletRequest接口中定义了一个getCookies方法,它用于从HTTP请求消息的Cookie请求头字段中读取所有的Cookie项。 IT资讯交流网 WWW.IT315.ORG

  11. Cookie的综合实例功能说明 • 程序包含两个Servlet组件:CookieServlet1.java和CookieServlet2.java。 • CookieServlet1中产生四个名称分别为name、nickname、email、phone的Cookie信息。name和nickname这两个Cookie的值是通过请求参数来设置的,并且nickname这个Cookie保持有效的时间为1年,email和phone这两个cookie的值是在程序中硬编码指定的。 • 在产生Cookie信息之后,CookieServlet1接着从请求消息中查找名称为nickname的Cookie信息,并根据返回结果打印出相应的问候语,CookieServlet1还打印出请求消息中的Cookie头字段的值。 • CookieServlet2首先创建三个名称分别为email、phone、sign的Cookie信息,并将phone这个Cookie保持有效的时间设置为了0秒,然后打印出请求消息中的Cookie头字段的值和每个Cookie的名称。 • CookieServlet2中的email和phone这两个Cookie曾在CookieServlet1程序中设置过,在CookieServlet2程序再次进行设置,是为了便于查看设置同名Cookie的效果和了解如何删除Cookie。 IT资讯交流网 WWW.IT315.ORG

  12. Cookie的综合实例实践 Cookie ckName = new Cookie("name",name); Cookie ckNickname = new Cookie("nickname",nickname); ckNickname.setMaxAge(365*24*3600); Cookie ckEmail = new Cookie("email","test1@it315.org"); Cookie ckPhone = new Cookie("phone","1111111"); response.addCookie(ckName); response.addCookie(ckNickname); response.addCookie(ckEmail); response.addCookie(ckPhone); String lastNickname = null; Cookie [] cks = request.getCookies(); for(int i=0; cks!=null && i<cks.length; i++) { if("nickname".equals(cks[i].getName())) { lastNickname = cks[i].getValue(); break; } } if(lastNickname != null) { out.println("欢迎您," + lastNickname ); } 动手体验:了解Cookie的工作细节 IT资讯交流网 WWW.IT315.ORG

  13. Session • 什么是Session • Session的跟踪机制 • Session的超时管理 • HttpSession接口中的方法 • HttpServletRequest接口中的Session方法 • application与session域范围的属性比较 • 利用Cookie实现Session跟踪 • 利用URL重写实现Session跟踪 IT资讯交流网 WWW.IT315.ORG

  14. 什么是Session • 使用Cookie和附加URL参数都可以将上一次请求的状态信息传递到下一次请求中,但是如果传递的状态信息较多,将极大降低网络传输效率和增大服务器端程序处理的难度。 • Session技术是一种将会话状态保存在服务器端的技术 ,它可以比喻成是医院发放给病人的病历卡和医院为每个病人保留的病历档案的结合方式 。 • 客户端需要接收、记忆和回送 Session的会话标识号,Session可以且通常是借助Cookie来传递会话标识号。 IT资讯交流网 WWW.IT315.ORG

  15. Session的跟踪机制 • Servlet API规范中定义了一个HttpSession接口,HttpSession接口定义了各种管理和操作会话状态的方法。 • HttpSession对象是保持会话状态信息的存储结构,一个客户端在WEB服务器端对应一个各自的HttpSession对象。 • WEB服务器并不会在客户端开始访问它时就创建HttpSession对象,只有客户端访问某个能与客户端开启会话的Servlet程序时,WEB应用程序才会创建一个与该客户端对应的HttpSession对象。 • WEB服务器为HttpSession对象分配一个独一无二的会话标识号,然后在响应消息中将这个会话标识号传递给客户端。客户端需要记住会话标识号,并在后续的每次访问请求中都把这个会话标识号传送给WEB服务器,WEB服务器端程序依据回传的会话标识号就知道这次请求是哪个客户端发出的,从而选择与之对应的HttpSession对象。 • WEB应用程序创建了与某个客户端对应的HttpSession对象后,只要没有超出一个限定的空闲时间段,HttpSession对象就驻留在WEB服务器内存之中,该客户端此后访问任意的Servlet程序时,它们都使用与客户端对应的那个已存在的HttpSession对象。 • HttpSession接口中专门定义了一个setAttribute方法来将对象存储到HttpSession对象中,还定义了一个getAttribute方法来检索存储在HttpSession对象中的对象,存储进HttpSession对象中的对象可以被属于同一个会话的各个请求的处理程序共享。 • Session是实现网上商城的购物车的最佳方案,存储在某个客户Session中的一个集合对象就可充当该客户的一个购物车。 IT资讯交流网 WWW.IT315.ORG

  16. Session的超时管理 • WEB服务器无法判断当前的客户端浏览器是否还会继续访问,也无法检测客户端浏览器是否关闭,所以,即使客户已经离开或关闭了浏览器,WEB服务器还要保留与之对应的HttpSession对象。 • 随着时间的推移而不断增加新的访问客户端,WEB服务器内存中将会因此积累起大量的不再被使用的HttpSession对象,并将最终导致服务器内存耗尽。 • WEB服务器采用“超时限制”的办法来判断客户端是否还在继续访问,如果某个客户端在一定的时间之内没有发出后续请求,WEB服务器则认为客户端已经停止了活动,结束与该客户端的会话并将与之对应的HttpSession对象变成垃圾。 • 如果客户端浏览器超时后再次发出访问请求,WEB服务器则认为这是一个新的会话的开始,将为之创建新的HttpSession对象和分配新的会话标识号。 • 会话的超时间隔可以在web.xml文件中设置,其默认值由Servlet容器定义。 <session-config> <session-timeout>30</session-timeout> </session-config> IT资讯交流网 WWW.IT315.ORG

  17. HttpSession接口中的方法 • getId方法 • getCreationTime方法 • getLastAccessedTime方法 • setMaxInactiveInterval方法 • getMaxInactiveInterval方法 • isNew方法 • 如果客户端请求消息中返回了一个与Servlet程序当前获得的HttpSession对象的会话标识号相同的会话标识号,则认为这个HttpSession对象不是新建的。 • invalidate方法 • getServletContext方法 • setAttribute方法 • getAttribute方法 • removeAttribute方法 • getAttributeNames方法 IT资讯交流网 WWW.IT315.ORG

  18. HttpServletRequest接口中的Session方法 • getSession方法 • public HttpSession getSession(boolean create) • public HttpSession getSession() • isRequestedSessionIdValid方法 • isRequestedSessionIdFromCookie方法 • isRequestedSessionIdFromURL方法 多想一想:什么情况下该调用request.getSession(false)方法 IT资讯交流网 WWW.IT315.ORG

  19. application域范围的属性 IT资讯交流网 WWW.IT315.ORG

  20. Session域范围的属性 IT资讯交流网 WWW.IT315.ORG

  21. Application与session域范围的属性比较实践 HttpSession session = request.getSession(); Integer sessionCount = (Integer)session.getAttribute("count"); int count = 0; if(sessionCount != null) { count = sessionCount.intValue(); } out.println("当前会话中发生了" + (++count) + "次访问<br>"); session.setAttribute("count",new Integer(count)); count = 0; ServletContext application = getServletContext(); Integer applicationCount = (Integer)application.getAttribute("count"); if(applicationCount != null) { count = applicationCount.intValue(); } out.println("WEB应用程序中发生了" + (++count) + "次访问<br>"); application.setAttribute("count",new Integer(count)); 动手体验:了解application和session域范围的属性的差异 IT资讯交流网 WWW.IT315.ORG

  22. 利用Cookie实现Session跟踪 • 如果WEB服务器处理某个访问请求时创建了新的HttpSession对象,它将把会话标识号作为一个Cookie项加入到响应消息中,通常情况下,浏览器在随后发出的访问请求中又将会话标识号以Cookie的形式回传给WEB服务器。 • WEB服务器端程序依据回传的会话标识号就知道以前已经为该客户端创建了HttpSession对象,不必再为该客户端创建新的HttpSession对象,而是直接使用与该会话标识号匹配的HttpSession对象,通过这种方式就实现了对同一个客户端的会话状态的跟踪。 动手体验:了解如何利用Cookie实现Session跟踪 IT资讯交流网 WWW.IT315.ORG

  23. 利用URL重写实现Session跟踪 • Servlet规范中引入了一种补充的会话管理机制,它允许不支持Cookie的浏览器也可以与WEB服务器保持连续的会话。这种补充机制要求在响应消息的实体内容中必须包含下一次请求的超链接,并将会话标识号作为超链接的URL地址的一个特殊参数。 • 将会话标识号以参数形式附加在超链接的URL地址后面的技术称为URL重写。如果在浏览器不支持Cookie或者关闭了Cookie功能的情况下,WEB服务器还要能够与浏览器实现有状态的会话,就必须对所有可能被客户端访问的请求路径(包括超链接、form表单的action属性设置和重定向的URL)进行URL重写。 • HttpServletResponse接口中定义了两个用于完成URL重写方法: • encodeURL方法 • encodeRedirectURL方法 动手体验:利用URL重写实现Session跟踪 IT资讯交流网 WWW.IT315.ORG

  24. Session的典型案例 • 使用Session实现购物车 • 利用Session防止表单重复提交 • 利用Session实现一次性验证码 • 跟踪用户上次访问站点的时间及Cookie中文问题 IT资讯交流网 WWW.IT315.ORG

  25. 使用Session实现购物车功能说明 • 程序包含一个HTML文件和两个Servlet组件:logon.html、LogonServlet.java和CoursesServlet.java。 • logon.html提供用户登录的界面;LogonServlet.java是一个负责处理用户登录的Servlet程序。 • CoursesServlet.java完成了三项功能:显示所有可选课程的列表、将用户选择的课程放入购物车、显示购物车中的课程。 • LogonServlet.java的登录验证方式非常简单,只要登录的用户名不为空白字符串即可;LogonServlet.java先将成功登录的用户名保存到Session中,然后将请求转发给CoursesServlet.java显示所有可选课程的列表;如果登录失败,LogonServlet.java则再次显示登录界面。 • CoursesServlet.java需要完成如下任务: • 首先判断访问请求是否来自一个已登录用户,如果不是,则将请求重定向到logon.html页面。 • 接着判断当前访问请求是否是用户选择课程时发出的,如果是,则将用户选择的课程加入购物车。 • 最后显示出所有供选择的课程列表和已放入购物车中的课程列表。 IT资讯交流网 WWW.IT315.ORG

  26. 使用Session实现购物车实践 String courseSelect = request.getParameter("course"); if(courseSelect != null) { Vector vCourses = (Vector)session.getAttribute("courses"); if(vCourses == null) { vCourses = new Vector(); vCourses.add(courseSelect); session.setAttribute("courses",vCourses); } else { if(vCourses.contains(courseSelect)) { out.println(sessionName + ",你以前选择过了" + courseSelect + "<hr>"); } else { vCourses.add(courseSelect); } } } 动手体验:使用Session实现购物车功能 IT资讯交流网 WWW.IT315.ORG

  27. 利用Session防止表单重复提交原理 • 包含有FORM表单的页面必须通过一个服务器程序动态产生,服务器程序为每次产生的页面中的FORM表单都分配一个唯一的随机标识号,并在FORM表单的一个隐藏字段中设置这个标识号,同时在当前用户的Session域中保存这个标识号。 • 当用户提交FORM表单时,负责接收这一请求的服务器程序比较FORM表单隐藏字段中的标识号与存储在当前用户的Session域中的标识号是否相同,如果相同则处理表单数据,处理完后清除当前用户的Session域中存储的标识号。在下列情况下,服务器程序将忽略提交的表单请求: • 当前用户的Session中不存在表单标识号 • 用户提交的表单数据中没有标识号字段 • 存储在当前用户的Session域中的表单标识号与表单数据中的标识号不同 • 浏览器只有重新向WEB服务器请求包含FORM表单的页面时,服务器程序才又产生另外一个随机标识号,并将这个标识号保存在Session域中和作为新返回的FORM表单中的隐藏字段值。 IT资讯交流网 WWW.IT315.ORG

  28. 利用Session防止表单重复提交实践 • 程序包含三个Java源程序:TokenProcessor.java、FormGenerateServlet.java和FormDealServlet.java。 • TokenProcessor.java是用于管理表单标识号的工具类,它主要用于产生、比较和清除存储在当前用户Session中的表单标识号。为了保证表单标识号的唯一性,每次将当前SessionID和系统时间的组合值按MD5算法计算的结果作为表单标识号,并且将TokenProcessor类设计为单件类。 • FormGenerateServlet.java是用于产生FORM表单的Servlet程序,FormDealServlet是负责处理FORM表单请求的Servlet程序。 多学两招:MD5算法及其应用 动手体验:利用Session防止表单重复提交 IT资讯交流网 WWW.IT315.ORG

  29. 利用Session防止表单重复提交问题 • 问题: 同一个用户打开同一个浏览器进程的多个窗口来并发访问同一个WEB站点的多个FORM表单页面时,将会出现表单无法正常提交的情况。 • 解决方案: • 将FORM表单的标识号作为表单隐藏字段的名称,如下所示: <input type='hidden' name='4b15c6b2f573831b4b5107d849fcafb8' value=''> • 将所有的表单标识号存储进一个Vector集合对象中,并将Vector集合对象存储进Session域中。当表单提交时,先从Session域中取出Vector集合对象,然后再从Vector集合对象中逐一取出每个表单标识号作为参数调用HttpServletRequest.getParameter方法,如果其中有一次调用的返回值不为null,则接受并处理该表单数据,处理完后将该表单标识号从Vector集合对象中删除。 IT资讯交流网 WWW.IT315.ORG

  30. 利用Session实现一次性验证码图例 IT资讯交流网 WWW.IT315.ORG

  31. 利用Session实现一次性验证码原理 • 一次性验证码的主要目的就是为了限制人们利用工具软件来暴力猜测密码,其原理与利用Session防止表单重复提交的原理基本一样,只是将表单标识号变成了验证码的形式,并且要求用户将提示的验证码手工填写进一个表单字段中,而不是通过表单的隐藏字段自动回传给服务器。 • 服务器程序接收到表单数据后,首先判断用户是否填写了正确的验证码,只有该验证码与服务器端保存的验证码匹配时,服务器程序才开始正常的表单处理流程。 • 密码猜测工具要逐一尝试每个密码的前题条件是先输入正确的验证码,而验证码是一次性有效的,这样基本上就阻断了密码猜测工具的自动地处理过程。 IT资讯交流网 WWW.IT315.ORG

  32. 利用Session实现一次性验证码实践 • 整个程序包含三个组件:check_code.html、CheckCodeServlet.java和LogonFormServlet.java。 • check_code.html是引用验证码图片的FORM表单页面,CheckCodeServlet.java是用于产生带有随机验证码图片的Servlet程序,LogonFormServlet.java则是负责处理FORM表单请求的Servlet程序。 动手体验:利用Session实现一次性验证码 多学两招:用时间间隔限制用户连续发帖 IT资讯交流网 WWW.IT315.ORG

  33. 跟踪用户上次访问站点的时间及Cookie中文问题 • 功能: 帮助网站实现提示客户端计算机上次访问网站的时间 • 实现原理: • 将每一个会话作为一次访问过程,将每次会话的开始时间作为每次访问网站的时间,然后将这个时间以Cookie的形式存储到客户端的计算机中,客户端进行下次访问时通过该Cookie回传上次访问站点的时间值。 • 为了让Cookie信息在客户端浏览器或计算机关闭后仍然保持存在,Cookie的保存时间被设置为了一年。 • Cookie值中包含有中文字符,如果直接将它们传递给浏览器,其中的中文字符将丢失,,因此需要采用BASE64编码方式将Cookie值编码成了可打印的ASCII字符后再进行传递。 IT资讯交流网 WWW.IT315.ORG

  34. 跟踪用户上次访问站点的时间及Cookie中文问题程序代码跟踪用户上次访问站点的时间及Cookie中文问题程序代码 //获取记录用户上次访问站点时间的Cookie Cookie [] cks = request.getCookies(); String lastAccessTime = getCookie(cks,"access_time"); if(lastAccessTime == null) { out.println("没有您上次的访问记录"); } else { BASE64Decoder decoder = new BASE64Decoder(); String decodedAccessTime = new String( decoder.decodeBuffer(lastAccessTime),"GB2312"); out.println("您上次的访问时间为" + decodedAccessTime); } //将用户开始本次访问的时间存储到客户端Cookie中 HttpSession session = request.getSession(); if(session.isNew()) { long createTime = session.getCreationTime(); Date dateCreateTime = new Date(createTime); SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd HH点mm分ss秒"); String formatedCreateTime = sdf.format(dateCreateTime); BASE64Encoder encoder = new sun.misc.BASE64Encoder(); String base64CreateTime = encoder.encode(formatedCreateTime.getBytes("GB2312")); ...... IT资讯交流网 WWW.IT315.ORG

  35. Session的持久化 • 为了提高服务器内存资源的利用率,WEB服务器通常将那些暂时不活动但未超时的HttpSession对象转移到文件系统或数据库中保存,一旦服务器需要使用它们时,再将它们从文件系统或数据库中装载进内存,这种技术称为Session的持久化。 • 将HttpSession对象保存到文件系统或数据库中时,需要采用序列化的方式将HttpSession对象中的每个属性对象保存到文件系统或数据库中;将HttpSession对象从文件系统或数据库中装载进内存时,需要采用反序列化的方式恢复HttpSession对象中的每个属性对象。 • 存储在HttpSession对象中的每个属性对象必须是可序列化的,即必须是实现了Serializable接口的对象。 • Session持久化的作用: • 提高服务器内存资源的利用率 • 在集群系统中同步Session对象 • 保障重启服务器和应用程序时,一些客户端的会话活动仍可继续 IT资讯交流网 WWW.IT315.ORG

  36. Tomcat中的Session持久化管理 • org.apache.catalina.session.StandardManager 默认的存储文件为: <tomcat安装目录>\work\Catalina\<主机名>\<应用程序名>\SESSIONS.ser • org.apache.catalina.session.PersistentManager 要求设备提供实现org.apache.catalina.Store接口的驱动类 • 配置 <Context path= "/it315" docBase="it315"> <Manager className="org.apache.catalina.session.PersistentManager" …> <Store className="…" …> </Manager> </Context> IT资讯交流网 WWW.IT315.ORG

  37. Tomcat中的Session持久化管理实践 • 程序包含三个组件: Student1.java、Student2.java和PersistentServlet.java。 • Student1.java和Student2.java是两个普通的Java类,Student2实现了Serializable接口,Student1没有实现Serializable接口,除此之外,Student1和Student2中的其他代码完全一样。 • PersistentServlet.java是一个Servlet程序,它在第一次被访问时将Student1和Student2的实例对象保存到Session域中,在以后被访问时又从Session域中读取先前保存的Student1和Student2的实例对象。 多学两招:了解Tomcat的Session持久化 IT资讯交流网 WWW.IT315.ORG

  38. 思考与实践(1) 1.在默认情况下,同一个浏览器访问Tomcat中的两个WEB应用程序时,两个WEB应用程序中的Session数据是不能共享的。Tomcat提供了让同一WEB站点上的所有应用程序之间能共享会话状态的设置选项,进入Tomcat自带的关于Tomcat 配置(Tomcat Configuration)的帮助文档,查看Http连接器(HTTP Connector)的属性设置说明,可以看到Http连接器中有一个emptySessionPath属性,将该属性设置为true时,同一WEB站点上的所有应用程序将共享会话信息,WEB服务器返回的会话标识号的Cookie项的path属性将被设置为“/”,即整个站点的根目录。请参照本书编写实验步骤的方法设计一个详细的实验步骤对此进行验证,并将完成的结果提交给www.it315.org站点评审,表现优异者将获得www.it315.org站点的奖励和专家的指点。提示:首先在应用程序appA中设置某个Session域属性,然后在应用程序appB的Session域中访问那个属性,如果不能无法访问到该属性,则说明两个WEB应用程序中的Session数据是不能共享的;接着修改Tomcat的Http连接器的配置,让同一WEB站点上的所有应用程序之间能共享会话状态,重复上面的操作和查看访问结果。 IT资讯交流网 WWW.IT315.ORG

  39. 思考与实践(2) 2.假设浏览器显示出了服务器返回的一个页面后,客户机发生了网络瞬间断线,且重新接通网络后客户端的IP地址发生了改变,如果用户继续接着在浏览器原来得到的页面中执行操作,其操作结果有可能受到网络断线的影响吗?例如,服务器端程序使用Session技术防止该表单被重复提交,当浏览器得到包含FORM表单的页面内容后,客户机发生了网络瞬间断线,这时候用户还能够继续使用原来获得的FORM表单提交数据吗? 3.本课的购物车例子程序缺少一个用户注销登录的功能,注销登录的程序代码虽然非常简单,但却非常有利于WEB服务器及时清理离开用户的HttpSession对象。另外,该购物车例子程序没有考虑客户端不支持Cookie的情况,即没有增加URL重写的方式来完成Session会话的跟踪。为了节省WEB服务器端的内存资源,不要创建一些无价值的HttpSession对象,WEB服务器与浏览器的会话过程最好是从用户成功登录后才正式建立,即WEB服务器只在用户成功登录后才真正创建HttpSession对象,而对于其他任何情况都不应创建HttpSession对象,本课的购物车例子程序没有按照这种思想设计。请在本课的购物车例子程序的基础上增加和完善上述功能。并将完成的结果提交给www.it315.org站点评审,表现优异者将获得www.it315.org站点的奖励和专家的指点。 IT资讯交流网 WWW.IT315.ORG

  40. 思考与实践(3) 4.当一个Servlet程序使用RequestDispatcher.forward方法调用另外一个Servlet程序时,调用者程序可以使用application、session、request这三个域范围中的属性来向被调用者程序传递对象数据,你觉得采用其中的哪个才是最佳方案?请说明不采用其他两个域范围的理由。 5.请参照本课的防止表单重复提交的例子程序设计如下一个应用程序并写出详细的实验步骤:WEB站点需要按使用Session防止表单重复提交,但也要支持在同一会话中可并行打开多个FORM表单页面的功能,例如,主窗口访问一个FORM表单页面后,接着又调用javascript 的window.open方法打开了另外一个FORM表单页面,这两个FORM表单都可以向WEB服务器提交一次数据。 6.一些网站通常采用在Session中记录用户发帖的时间,然后通过一个时间间隔来限制用户连续发帖的数量,请编写一个限定用户连续两次提交表单的最小时间间隔的程序来模拟这种应用。 IT资讯交流网 WWW.IT315.ORG

  41. 结束语 欢迎大家参与多媒体IT课堂其他课程 欢迎加入IT315把宝贵经验分享给大家 相聚的地方,就在…… HTTP://WWW.IT315.ORG IT资讯交流网 WWW.IT315.ORG

More Related