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

Slides:



Advertisements
Similar presentations
第 4 章 配合 例子源代码一起使用 Power point 制作:耿祥义 张跃平 普通高等教育 “ 十一五 ” 国家级规划教材 JSP 内置对象.
Advertisements

第 4 章 JSP 内置对象 本章主要内容:  内置对象的概念  内置对象的作用域和生命期  内置对象的作用和关系  内置对象的使用方法.
Java Web 开发 授课人:张鸽. 第三讲 JSP 内置对象  JSP 有以下九种内置对象,包括:  ·request ,请求对象  ·response ,响应对象  ·pageContext ,页面上下文对象  ·session ,会话对象  ·application ,应用程序对象.
第 4 课 使用 JSP 处理客户端请求.  掌握 Form 表单的请求处理  掌握 JSP 常用内置对象的用法 out 对象 request 对象 response 对象 本章目标.
LOGO 第 9 章 Java Servlet 和 JSP 编程 孙焘. 重点: servlet 编程原理 1 servlet 的基础类与编程实现 2 JSP 编程原理 3 JSP 的常用语法 4.
Web Maple— 云端计 算 数学学院刘海洋 胡婷婷. 需求 什么是 Web Maple ? Maple : “ 数学家的软件 ” 符号和数值计算 动态编程语言 集成编辑环境与图形输出 Web Maple :网页上的数学家 完整的 Maple 功能 云端计算 网页独特的输入输出格式.
Java语言的特点 Java开发环境的搭建
动态Web开发技术--JSP.
第四章 内容提要: 电子商务的安全技术 本章从电子商务的安全要求入手,介绍电子商务的几种安全技术,从而说明电子商务安全问题有哪些,其根源何在、带来哪些风险、如何应用安全技术等。
第 4 章 PHP 基本語法.
第一章 JSP概述.
第五章 JSP内置对象 第4章学习了页面组成元素和使用方法。本章学习JSP内置对象的使用。使用JSP内置对象,可以方便操作页面,访问页面环境,实现页面内、页面间、页面与环境之间的通讯。 学习目标 熟悉主要内置对象的概念 理解主要内置对象的作用域和生命期 理解主要内置对象的作用和关系 熟悉主要内置对象的使用方法.
7.5 其他对象 JSP 视频教学课程.
基于JSP搭建Web应用程序.
上节课我们是讲解了request, response, session, application 等内置对象,有了它们,我们就可以编写一个完整的应用程序了。 我们来看ebank这个小应用程序的编写。
移动校园Hybrid应用开发介绍 2015年11月.
事件驱动的移动数据中心 广州舜飞信息科技有限公司 谭荣棉.
审计案例研究 第一讲 辅导教师 周桂芝.
二十世纪外国文学专题 章丘电大 李颜.
SAE Java 实际应用 在这里写上你的标题 作者名字/日期
汇报大纲 一、报送系统总体介绍 二、自查及检查评分报送流程 三、自查及检查方法及关键点 四、建议及注意事项.
MVC Servlet与MVC设计模式.
第七章 电子商务系统的运营与维护.
第4章 JavaScript脚本语言基础 4.1 JavaScript简介 4.2 JavaScript语法基础
第三章 使用XMLHttpRequest对象
Microsoft Application Center Test
Servlet技术.
《ASP.NET数据库网站设计教程(C#版)》
Hello World 體驗實作第一個JSP程式.
第9章 过滤器和监听器技术 过滤器(Filter)和监听器(Listener)是两种特殊的Servlet技术。过滤器可以对用户的请求信息和响应信息进行过滤,常被用于权限检查和参数编码统一设置等。监听器可以用来对Web应用进行监听和控制的,增强Web应用的事件处理能力。 本章主要介绍过滤器和监听器的编程接口、基本结构、信息配置、部署和运行,最后通过案例说明过滤器和监听器的典型应用。
第四章 網頁表單與資料傳遞.
软件设计模式与体系结构课程设计 周 宇 College of Information Science and Technology
AJAX基础.
数据库操作示例 import java.sql.*; //导入java.sql包 public class JDBCDemo {
张孝祥IT课堂 -深入体验Java Web开发内幕
专题4:JSP脚本和指令.
Tomcat的组织结构及集群原理 李 山.
JSP自定义标签技术的分析与应用 ----Custom Tag 的分析与应用
胡鹏 王慧锋 TEL: 数据库系统原理课程设计 实验环节1 胡鹏 王慧锋 TEL:
第3章 語法入門 第一個Java程式 文字模式下與程式互動 資料、運算 流程控制.
電子商務網站建制技術與實習(II) 助教:江宜政 吳昇洋.
Cookie 存取Cookie Cookie有效時間 Session 存取Session session 函數
進階 WWW 程式設計 -- PHP Regular Expression 靜宜大學資訊管理學系 蔡奇偉副教授 2004
PHP5與MySQL5 入門學習指南 凱文瑞克 著 第 18 章 Cookie和 Session.
第六讲 JSP中的文件操作(2) 教学目的 本讲继续讲述JSP中使用Java输入、输出流实现文件的读写操作 。 1 文件上传 2 文件下载
Oracle Containers for J2EE(OC4J) 独立版
認識FTP檔案傳輸協定 建立我的部落格 Archie檔案檢索服務 Google搜尋密技 歷久彌新的老朋友-BBS Skype網路電話
简单的介绍,简单的配置,简单的扩展 By jfm
ASP动态网页设计实用教程 主讲教师: 开课单位:.
NAMO網頁製作教學簡報 講師:李惠茹.
DWR WEB开发交流 1、自我介绍 2、DWR概述 3、DWR DEMO介绍 4、DWR实现机制 5、DWR配置说明 6、JS开发注意事项.
張智星 台大資工系 多媒體檢索實驗室 第九章 小餅乾(Cookies) 張智星 台大資工系 多媒體檢索實驗室.
第 6 章 Application、Session 物件與Cookie
第一讲 J2EE基础 博和利初级培训 —开发技能.
第11章 Android客户端与服务器交互.
電子商務網站架設技術 利用FB做Login
Cookie 存取Cookie Cookie有效時間 Session 存取Session session 函數
第一章 JSP概述 study-thinking-action.
第4章 ASP.NET的HTTP物件、輸出入與Cookie處理
第3章 Java語法的JSP程式 3-1 Java語言的基礎 3-2 JSP程式的基本架構 3-3 Java的變數與資料型態
Ch09 在網頁之間傳遞資訊 網頁程式設計.
JSP程序设计 第9章 Servlet简介.
第十二章 过滤器.
1 Session对象的特性 Session 状态对象 Session 对象常用的方法有: Session 对象常用的属性有:
蕭旭雯 中華民國期刊論文索引系統 蕭旭雯
HTML表单 JSP借由标签所构成的表单区块中,取得用户在其中特定字段输入的数据內容 。 JSP 动态网页新技术.
第 5 章 常用类的使用 伍孝金
第5章 表达式语言.
知识点讲解 1、DOM节点树 DOM(Document Object Model)称为文档对象模型,是一个表示和处理文 档的应用程序接口(API),可用于动态访问、更新文档的内容、结构和样 式。DOM将网页中文档的对象关系规划为节点层级,构成它们之间的等级关 系,这种各对象间的层次结构被称为节点树。如下图所示。
Presentation transcript:

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

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

会话与会话状态简介 在日常生活中,从拨通电话到挂断电话之间的一连串的你问我答的过程就是一个会话。 WEB应用中的会话是指一个客户端浏览器与WEB服务器之间连续发生的一系列请求和响应过程。 WEB应用的会话状态是指WEB服务器与浏览器在会话过程中产生的状态信息,借助会话状态,WEB服务器能够把属于同一会话中的一系列的请求和响应过程关联起来。 在同一时间有多个浏览器访问购物程序,购物程序怎么识别出是哪个登录用户?用什么方式?用传递参数的方式即可!如果要记忆的信息很多,譬如,卖了多本书,每一 本书都要作为参数,很麻烦! IT资讯交流网 WWW.IT315.ORG

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

什么是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

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

Set-Cookie2响应头字段 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规范中没有明确限定编码方式。 IT资讯交流网 WWW.IT315.ORG

多想一想:如果浏览器接收到两个名称完全相同的Cookie,后面接收的Cookie是否会替换前面接收的Cookie 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

Cookie请求头字段 浏览器使用Cookie请求头字段将Cookie信息回送给WEB服务器。 请求的主机名是否与某个存储的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

在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

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

动手体验:了解Cookie的工作细节 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 ); 写完CookieServlet1后,不直接用浏览器访问,先用命令行看看! 为什么要安排4个Cookie,是为了测试setPath和SetAge等各种方法。 动手体验:了解Cookie的工作细节 IT资讯交流网 WWW.IT315.ORG

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

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

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

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

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

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

application域范围的属性 线条不一致,书中要修改 IT资讯交流网 WWW.IT315.ORG

Session域范围的属性 线条不一致,书中要修改 IT资讯交流网 WWW.IT315.ORG

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

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

动手体验:利用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

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

使用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

动手体验:使用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>"); 在logon.html页面中不加<base>标签,先不输用户名登陆,回到登陆页面,再不输入用户名登陆,报错! <base>的作用,浏览器原来计算相对路径是以地址栏中的路径作为基准,加了<base>就以<base>指定的路径为基准。 在调用request.getRequestDispatcher方法返回RequestDispatcher对象时,有可能得到null,因此,严谨的程序应该对这个返回值进行检查,而书中的例子没有进行此项检查。 动手体验:使用Session实现购物车功能 IT资讯交流网 WWW.IT315.ORG

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

利用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

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

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

利用Session实现一次性验证码原理 服务器程序接收到表单数据后,首先判断用户是否填写了正确的验证码,只有该验证码与服务器端保存的验证码匹配时,服务器程序才开始正常的表单处理流程。 密码猜测工具要逐一尝试每个密码的前题条件是先输入正确的验证码,而验证码是一次性有效的,这样基本上就阻断了密码猜测工具的自动地处理过程。 IT资讯交流网 WWW.IT315.ORG

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

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

跟踪用户上次访问站点的时间 及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

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

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

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

思考与实践(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

思考与实践(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

思考与实践(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

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