
教案课程名称授课教师黄潇《Web系统开发》第4章Servlet技术基础2学时教学题目教学时数补充:会话技术1.HTTP会话简介2.Cookie技术(工作原理,相关API)教学内容3.Session技术(工作原理,相关API)4.Cookie和Session在项目中的应用1.知识目标:使学生了解Cookie和Session的基本概念、工作原理及其在Web应用中的作用。2.能力目标:教学目标培养学生能够在实际Web开发中应用Cookie和Session技术实现用户会话管理。3.思政目标:通过讲解网络会话安全的重要性,培养学生的网络安全意识和信息道德观念,强调个人隐私保护和信息安全的社会责任。教学重点Cookie和Session的工作原理,Cookie和Session在项目中的应用。教学难点Cookie和Session在Web项目中的应用。教学课型团理论课口实验课授课手段多媒体教学1.理论讲解:通过PPT展示和口头讲解的方式,介绍Cookie和Session的基本概念和工作原理。2.案例分析:分析几个典型的Web应用案例,展示Cookie和Session在实际项目中的应用授课方法场景。3.实践操作:指导学生编写简单的Web应用代码,实现基于Cookie和Session的用户会话管理功能。4.思政引导:在讨论和实践中,穿插网络安全意识、信息道德观念和社会责任感的引导。专业术语Servlet,HttpServlet,HttpServletRequest, HttpServletResponse1.梁永先、陈滢生、尹校军,JavaWeb程序设计(慕课版)第2版,人民邮电出版社,2021.3参考资料2.汪诚波,JavaWeb开发技术与实践,清华大学出版社,2018.93.千锋教育高教产品研发部,JavaWeb开发实战,清华大学出版社,2018.111.编写一篇关于如何在Web开发中合理使用Cookie和Session来保护用户隐私的短文。课后作业2.设计并实现一个简单的Web登录系统,要求使用Session技术实现用户身份验证和状态管理,并考虑安全性因素
教 案 课程名称 《Web 系统开发》 授课教师 黄 潇 教学题目 第 4 章 Servlet 技术基础 补充:会话技术 教学时数 2 学时 教学内容 1. HTTP 会话简介 2. Cookie 技术(工作原理,相关 API) 3. Session 技术(工作原理,相关 API) 4. Cookie 和 Session 在项目中的应用 教学目标 1. 知识目标: 使学生了解 Cookie 和 Session 的基本概念、工作原理及其在 Web 应用中的作用。 2. 能力目标: 培养学生能够在实际 Web 开发中应用 Cookie 和 Session 技术实现用户会话管理。 3. 思政目标: 通过讲解网络会话安全的重要性,培养学生的网络安全意识和信息道德观念,强调个 人隐私保护和信息安全的社会责任。 教学重点 Cookie 和 Session 的工作原理,Cookie 和 Session 在项目中的应用。 教学难点 Cookie 和 Session 在 Web 项目中的应用。 教学课型 理论课 实验课 授课手段 多媒体教学 授课方法 1. 理论讲解:通过 PPT 展示和口头讲解的方式,介绍 Cookie 和 Session 的基本概念和工作 原理。 2. 案例分析:分析几个典型的 Web 应用案例,展示 Cookie 和 Session 在实际项目中的应用 场景。 3. 实践操作:指导学生编写简单的 Web 应用代码,实现基于 Cookie 和 Session 的用户会话 管理功能。 4. 思政引导:在讨论和实践中,穿插网络安全意识、信息道德观念和社会责任感的引导。 专业术语 Servlet,HttpServlet,HttpServletRequest,HttpServletResponse 参考资料 1.梁永先、陈滢生、尹校军,Java Web 程序设计(慕课版)第 2 版,人民邮电出版社, 2021.3 2.汪诚波,Java Web 开发技术与实践, 清华大学出版社,2018.9 3.千锋教育高教产品研发部,Java Web 开发实战,清华大学出版社,2018.11 课后作业 1. 编写一篇关于如何在 Web 开发中合理使用 Cookie 和 Session 来保护用户隐私的短文。 2. 设计并实现一个简单的 Web 登录系统,要求使用 Session 技术实现用户身份验证和状态 管理,并考虑安全性因素

通过本讲的教学,了解并掌握了两种会话技术的工作原理,并知晓了在实际项目中应用会话技术的注意事项和技巧,希望在课后动手实践和实验中,能够灵活运用这两种教学后记会话技术,进一步提高自己的编程能力。本讲也通过强调网络安全意识和信息道德观念1在Web开发中的重要性,提醒学生作为未来Web开发者应承担的社会责任。整体来讲,本讲课堂效果较好。教学设计:从学生所掌握的网络知识“HTTP协议无状态”入手,提出问题引导学生思考并引出本讲主要内容一一会话技术。一、新课导入,并明确学习目标我们都知道浏览器是没有状态的(HTTP协议无状态),非持久连接。也就是说,你第二次通过某个浏览器访问Web应用,它其实不知道你已经来过一次了。但是,当用户通过浏览器访问Web应用时,通常情况下,服务器需要对用户的状态进行跟踪。例如,用户在网站结算商品时,Web服务器必须根据请求用户的身份,找到该用户所购买的商品。【提问】在用户访问某网站期间,Web服务器是如何记住该已注册或已登录用户信息的呢?教学组织什么是会话呢?Web应用中的会话过程类似于生活中的打电话过程,它指的是一个客过程1户端(浏览器)与Web服务器之间连续发生的一系列请求和响应过程,例如,一个用户在(10分钟)某网站上的整个购物过程就是一次会话,又如用户登录一个网上论坛并给网帖留言,这个过程所引发的一系列的请求响应过程就是一次会话。会话过程中的每次请求和响应都会产生数据,而HTTP协议是无状态的协议,它不会为了下一次请求而保存本次请求传输的信息,这就给实现多次请求的业务逻辑带来一定的困难。例如,用户成功登录某网上论坛之后,当用户想回复相应的网帖时,需要重新向服务器发送一次请求,而此时,上一次请求传输的信息已经失效,用户在发帖之前还需再次登录,这就会降低用户的使用体验。为解决这个问题,会话跟踪被引入到Web开发的技术体系中,它用于保存会话过程中产生的数据,使一次请求所传递的数据能够维持到后续的请求。在Web开发中,服务器跟踪用户信息的技术称为会话技术。会话跟踪采用的方案包括Cookie和Session,Cookie工作在客户端,Session工作在服务端。教学设计:Cookie基本是常见浏览器均支持的,所以在讲完其工作原理后,带学生一起找到自己电脑中常使用浏览器的Cookie,并查看其保存的内容,以助于更深理解Cookie的功能。在讲解如何使用Cookie保存用户信息时,以具体场景实例边演示边讲解,以助于学生更好理解和掌握。教学组织过程2二、本讲主要内容(30分钟)(一)Cookie技术1.Cookie简介(1)定义Cookie是由W3C组织提出的一种在客户端保持会话跟踪的解决方案。具体来讲,它是服务器为了识别用户身份而存储在客户端上的文本信息。Cookie功能需要客户端(主要
教学后记 通过本讲的教学,了解并掌握了两种会话技术的工作原理,并知晓了在实际项目中 应用会话技术的注意事项和技巧,希望在课后动手实践和实验中,能够灵活运用这两种 会话技术,进一步提高自己的编程能力。本讲也通过强调网络安全意识和信息道德观念 在 Web 开发中的重要性,提醒学生作为未来 Web 开发者应承担的社会责任。整体来讲, 本讲课堂效果较好。 教学组织 过程 1 (10 分钟) 教学设计: 从学生所掌握的网络知识“HTTP 协议无状态”入手,提出问题引导学生思考并引 出本讲主要内容——会话技术。 一、新课导入,并明确学习目标 我们都知道浏览器是没有状态的(HTTP 协议无状态),非持久连接。也就是说,你 第二次通过某个浏览器访问 Web 应用,它其实不知道你已经来过一次了。但是,当用户通 过浏览器访问 Web 应用时,通常情况下,服务器需要对用户的状态进行跟踪。例如,用户 在网站结算商品时,Web 服务器必须根据请求用户的身份,找到该用户所购买的商品。 【提问】在用户访问某网站期间,Web 服务器是如何记住该已注册或已登录用户信息 的呢? 什么是会话呢?Web 应用中的会话过程类似于生活中的打电话过程,它指的是一个客 户端(浏览器)与 Web 服务器之间连续发生的一系列请求和响应过程,例如,一个用户在 某网站上的整个购物过程就是一次会话,又如用户登录一个网上论坛并给网帖留言,这个 过程所引发的一系列的请求响应过程就是一次会话。 会话过程中的每次请求和响应都会产生数据,而 HTTP 协议是无状态的协议,它不会 为了下一次请求而保存本次请求传输的信息,这就给实现多次请求的业务逻辑带来一定的 困难。例如,用户成功登录某网上论坛之后,当用户想回复相应的网帖时,需要重新向服 务器发送一次请求,而此时,上一次请求传输的信息已经失效,用户在发帖之前还需再次 登录,这就会降低用户的使用体验。 为解决这个问题,会话跟踪被引入到 Web 开发的技术体系中,它用于保存会话过程中 产生的数据,使一次请求所传递的数据能够维持到后续的请求。 在 Web 开发中,服务器跟踪用户信息的技术称为会话技术。会话跟踪采用的方案包括 Cookie 和 Session,Cookie 工作在客户端,Session 工作在服务端。 教学组织 过程 2 (30 分钟) 教学设计: Cookie 基本是常见浏览器均支持的,所以在讲完其工作原理后,带学生一起找到自己 电脑中常使用浏览器的 Cookie,并查看其保存的内容,以助于更深理解 Cookie 的功能。 在讲解如何使用 Cookie 保存用户信息时,以具体场景实例边演示边讲解,以助于学生更 好理解和掌握。 二、本讲主要内容 (一)Cookie 技术 1. Cookie 简介 (1)定义 Cookie 是由 W3C 组织提出的一种在客户端保持会话跟踪的解决方案。具体来讲,它 是服务器为了识别用户身份而存储在客户端上的文本信息。Cookie 功能需要客户端(主要

是浏览器)的支持,目前Cookie已成为一项浏览器的标准,几乎主流的浏览器(如IE、FireFox等)都支持Cookie。Cookie是Web服务器存储在用户浏览器上的一段小数据,用于识别用户身份或存储用户偏好。(2)工作原理服务器发送包含Set-Cookie头部的HTTP响应,浏览器接收到后存储Cookie,并在后续的请求中通过Cookie头部发送给服务器。国请来Web Serverl次访NN第一次访间servler1,Cookie不存在Set-Cookie:name=value后续访间服务器Cookie:name=value浏览器Cookie存放区浏览器缓冲区(3)应用场景:个性化设置、购物车、登录状态保持等。(4)安全性考虑:HttpOnly、Secure、SameSite等属性设置,避免XSS和CSRF攻击。2.javax.servlet.http.Cookie类(1)生成Cookie对象语法格式:publicCookie(Stringname,Stringvalue)Cookie一旦创建,它的名称就不能被修改,但它的值可以被修改。(2)Cookie类的常用API(具体参见API文档)1)setMaxAge(intmaxAge)方法用于设置Cookie的有效期。如果参数值为正数,客户端会将Cookie持久化,写到本地磁盘的Cookie文件中,如果没有超过指定时间,即使关闭客户端,Cookie仍然有效。如果参数值为负数,客户端只是临时保存Cookie,如果关闭客户端,Cookie信息会被删除。maxAge默认值为-1。如果maxAge为0,则表示删除该Cookie。2)setPath(Stringpath)方法用于设置Path的有效目录路径。例如,把Cookie的有效路径设置为“lycu/”,那么当浏览器访问“ycu”目录下的Web资源时,都会带上Cookie,如果把Cookie的有效路径设置为“lycu/jsj/”,那么浏览器只有在访问ycu目录下的jsj子目录里面的Web资源时才会带上Cookie,而当访问ycu目录下的其他Web资源时,浏览器是不带Cookie的。如果想让某个Cookie项对站点的所有目录下的访问路径都有效,应调用Cookie对象的setPathO方法将其Path属性设置为“”。3)setDomain(Stringpattern)setDomain(Stringpattern)方法用于设置Cookie的有效域名,该方法的参数值必须以“开头,不区分大小写。Cookie是不可跨域名的,例如域名http:/www.mobiletrain.org/颁发的Cookie不能被提交到域名http://www.qfedu.com/,这是由域名的隐私安全机制决定的。(3)服务器向客户端响应Cookie完成Cookie的属性设置以后,可以调用HttpServletResponse对象的addCookieO方法
是浏览器)的支持,目前 Cookie 已成为一项浏览器的标准,几乎主流的浏览器(如 IE、 FireFox 等)都支持 Cookie。Cookie 是 Web 服务器存储在用户浏览器上的一段小数据,用 于识别用户身份或存储用户偏好。 (2)工作原理 服务器发送包含 Set-Cookie 头部的 HTTP 响应,浏览器接收到后存储 Cookie,并在后 续的请求中通过 Cookie 头部发送给服务器。 (3)应用场景:个性化设置、购物车、登录状态保持等。 (4)安全性考虑:HttpOnly、Secure、SameSite 等属性设置,避免 XSS 和 CSRF 攻击。 2. javax.servlet.http.Cookie 类 (1)生成 Cookie 对象 语法格式:public Cookie(String name, String value) Cookie 一旦创建,它的名称就不能被修改,但它的值可以被修改。 (2)Cookie 类的常用 API(具体参见 API 文档) 1)setMaxAge(int maxAge)方法 用于设置 Cookie 的有效期。如果参数值为正数,客户端会将 Cookie 持久化,写到本 地磁盘的 Cookie 文件中,如果没有超过指定时间,即使关闭客户端,Cookie 仍然有效。 如果参数值为负数,客户端只是临时保存 Cookie,如果关闭客户端,Cookie 信息会被删除。 maxAge 默认值为–1。如果 maxAge 为 0,则表示删除该 Cookie。 2)setPath(String path)方法 用于设置 Path 的有效目录路径。例如,把 Cookie 的有效路径设置为“/ycu/”,那么 当浏览器访问“ycu”目录下的 Web 资源时,都会带上 Cookie,如果把 Cookie 的有效路径 设置为“/ycu/jsj/”,那么浏览器只有在访问 ycu 目录下的 jsj 子目录里面的 Web 资源时才 会带上 Cookie,而当访问 ycu 目录下的其他 Web 资源时,浏览器是不带 Cookie 的。如果 想让某个 Cookie 项对站点的所有目录下的访问路径都有效,应调用 Cookie 对象的 setPath() 方法将其 Path 属性设置为“/”。 3)setDomain(String pattern) setDomain(String pattern)方法用于设置 Cookie 的有效域名,该方法的参数值必须以“.” 开头,不区分大小写。Cookie 是不可跨域名的,例如域名 http://www.mobiletrain.org/颁发 的 Cookie 不能被提交到域名 http://www.qfedu.com/,这是由域名的隐私安全机制决定的。 (3)服务器向客户端响应 Cookie 完成 Cookie 的属性设置以后,可以调用 HttpServletResponse 对象的 addCookie()方法

通过增加Set-Cookie响应头的方式将其响应给客户端,客户端再将其存储在本地中。public void addcookie (Cookie cookie)其中的参数为Cookie对象。该方法响应给客户端的Cookie仅对当前客户端有效,不能跨客户端。(4)服务器获取客户端发送的Cookie当客户端向服务器发送带Cookie的请求时,服务器通过调用HttpServletRequest对象的getCookiesO方法将其获取,该方法返回封装了所有Cookie对象的数组,遍历该数组即可获取各个Cookie对象。HttpServletRequest对象的getCookiesO方法的格式如下。public Cookiell getCookies()在默认情况下,Cookie只能被创建它的应用获取。如果需要扩展Cookie的有效目录路径,Cookie的setPathO方法可以重新指定其访问路径。(5)Cookie的修改、删除Cookie类没有提供直接修改或删除Cookie的方法。如果要修改客户端上的某个Cookie,只需要新建一个同名的Cookie,并添加到Response对象中覆盖原来的Cookie即可。如果要删除客户端上的某个Cookie,只需新建一个同名的Cookie,将maxAge设置为O,并添加到Response对象中覆盖原来的Cookie即可。这里要注意的是,在修改、删除Cookie时,新建的Cookie除value、maxAge之外的所有属性都要与原Cookie一样。否则,客户端将它们视为两个不同的Cookie,从而导致修改、删除失败。3.Cookie编程场景实例一一网站推广:当用户在电商网站浏览某些商品信息时,网站会通过Cookie将浏览数据保存在客户端,用户下次打开网站,网站会向用户推广最近浏览过的商品信息。新建一个Servlet类TestCookie03,添加如下代码:Cookie cookie = null:response.setContentType("text/html;charset=UTF-8");PrintWriter out= response.getWriterO,out.println("商品列表"),out.println("商品01");out.println("商品02");out.println("商品03");out.println("商品04")Cookielcookies=request.getCookiesO;/如果Cookies不为NULL遍历Cookies,获取Cookie对象,并向客户端响应Cookie值if(cookies =null)for(int i= 0 ; i< cookies.length ; i++)if(cookies[il.getNameO.equals("itemsNum"))out.println("你可能需要商品["+cookies[il.getValue+"]")cookie=cookies[i];1/如果Cookies不为NULLlelselout.println("No cookie."),StringitemNum=request.getParameter("itemNum")),1/获取传递的参数/如果itemNum不为空,创建一个Cookie对象并返回给浏览器if(itemNum!=null)cookie = new Cookie("itemsNum",itemNum),cookie.setMaxAge(60*60*24)
通过增加 Set-Cookie 响应头的方式将其响应给客户端,客户端再将其存储在本地中。 其中的参数为 Cookie 对象。该方法响应给客户端的 Cookie 仅对当前客户端有效,不 能跨客户端。 (4)服务器获取客户端发送的 Cookie 当客户端向服务器发送带 Cookie 的请求时,服务器通过调用 HttpServletRequest 对象 的 getCookies()方法将其获取,该方法返回封装了所有 Cookie 对象的数组,遍历该数组即 可获取各个 Cookie 对象。HttpServletRequest 对象的 getCookies()方法的格式如下。 在默认情况下,Cookie 只能被创建它的应用获取。如果需要扩展 Cookie 的有效目录 路径,Cookie 的 setPath()方法可以重新指定其访问路径。 (5)Cookie 的修改、删除 Cookie 类没有提供直接修改或删除 Cookie 的方法。如果要修改客户端上的某个 Cookie,只需要新建一个同名的 Cookie,并添加到 Response 对象中覆盖原来的 Cookie 即 可。如果要删除客户端上的某个 Cookie,只需新建一个同名的 Cookie,将 maxAge 设置为 0,并添加到 Response 对象中覆盖原来的 Cookie 即可。 这里要注意的是,在修改、删除 Cookie 时,新建的 Cookie 除 value、maxAge 之外的 所有属性都要与原 Cookie 一样。否则,客户端将它们视为两个不同的 Cookie,从而导致 修改、删除失败。 3. Cookie 编程 场景实例——网站推广:当用户在电商网站浏览某些商品信息时,网站会通过 Cookie 将浏览数据保存在客户端,用户下次打开网站,网站会向用户推广最近浏览过的商品信息。 新建一个 Servlet 类 TestCookie03,添加如下代码: Cookie cookie = null; response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("商品列表"); out.println("商品 01"); out.println("商品 02"); out.println("商品 03"); out.println("商品 04"); Cookie[] cookies = request.getCookies(); //如果 Cookies 不为 NULL,遍历 Cookies,获取 Cookie 对象,并向客户端响应 Cookie 值 if(cookies != null){ for(int i = 0 ; i < cookies.length ; i++){ if(cookies[i].getName().equals("itemsNum")){ out.println("你可能需要:商品[" + cookies[i].getValue() + "]"); cookie = cookies[i]; } } }else{ out.println("No cookie."); }//如果 Cookies 不为 NULL String itemNum = request.getParameter("itemNum"); //获取传递的参数 //如果 itemNum 不为空,创建一个 Cookie 对象并返回给浏览器 if(itemNum!=null){ cookie = new Cookie("itemsNum",itemNum); cookie.setMaxAge(60*60*24);

response.addCookie(cookie);1out.println("");【课堂练习】:显示用户上次访问时间。当用户访问某些Web应用时,经常会显示出008该用户上一次的访问时间。例如,QQ登录成功C个0@lo》=120%后,会显示用户上次的登录时间。要求使用欢迎回来,您上次访问时间为:2020年07月20日13:57:17Cookie技术实现显示用户上次的访问时间。显示用户上次访问时间效果如下图所示。提示:往Cookie中写入中文信息时,需先使用URLEncoder.encode(要写入的信息,"utf-8")方法进行编码再写入,而从Cookie中取出中文信息后,也需使用URLDecoder.decode(要解码的信息,"utf-8")解码再使用。实现如下:在Eclipse中新建Web项目chap04servlet,在src下新建包test_cookie中编写一个名称为LastAccessServlet的Servlet类,该类主要用于获取Cookie信息中的时间并发送给客户端。package chap04.test_cookie;import java.io.IOException;import java.net.URLDecoder;import java.net.URLEncoder;importjava.text.SimpleDateFormat;import java.util.Dateimport javax.servlet.ServletException,importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.Cookie,importjavax.servlet.http.HttpServlet,importjavax.servlet.http.HttpServletRequest:importjavax.servlet.http.HttpServletResponse,@WebServlet("/LastAccessServlet")public class LastAccessServletextends HttpServletprivate static final long serialVersionUID=IL:protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException,IOExceptionCookie[l cookies=request.getCookies();response.setContentType("text/html;charset-utf-8");Date tDate = new DateO;SimpleDateFormatsdf=newSimpleDateFormat("yyyy年MM月dd日HH:mm.ss"),StringaccessTime=sdf.format(tDate),StringthisAccessTime=URLEncoder.encode(accessTime,"utf-8"),boolean flag=false,for (Cookie c:cookies)Stringname=c.getName0)
response.addCookie(cookie); } out.println(""); 【课堂练习】:显示用户上次访问时间。 当用户访问某些 Web 应用时,经常会显示出 该用户上一次的访问时间。例如,QQ 登录成功 后,会显示用户上次的登录时间。要求使用 Cookie 技术实现显示用户上次的访问时间。显示 用户上次访问时间效果如下图所示。 提示:往 Cookie 中写入中文信息时,需先使用 URLEncoder.encode(要写入的信息, "utf-8") 方 法 进 行 编 码 再 写 入 , 而 从 Cookie 中 取 出 中 文 信 息 后 , 也 需 使 用 URLDecoder.decode(要解码的信息, "utf-8")解码再使用。 实现如下: 在 Eclipse 中新建 Web 项目 chap04_servlet,在 src 下新建包 test_cookie 中编写一个名 称为 LastAccessServlet 的 Servlet 类,该类主要用于获取 Cookie 信息中的时间并发送给客 户端。 package chap04.test_cookie; import java.io.IOException; import java.net.URLDecoder; import java.net.URLEncoder; import java.text.SimpleDateFormat; import java.util.Date; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/LastAccessServlet") public class LastAccessServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Cookie[] cookies = request.getCookies(); response.setContentType("text/html;charset=utf-8"); Date tDate = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy 年 MM 月 dd 日 HH:mm:ss"); String accessTime = sdf.format(tDate); String thisAccessTime = URLEncoder.encode(accessTime, "utf-8"); boolean flag = false; for (Cookie c : cookies) { String name = c.getName();

System.out.println(name+":"+c.getValue(),if("lastTime".equals(name))flag=true,String vString = c.getValueO);String lastTime=URLDecoder.decode(vString,"utf-8");response.getWriterO).write("欢迎回来,您上次访问的时间是:"+lastTime),c.setValue(thisAccessTime);c.setMaxAge(60 * 60 * 24 * 30);response.addCookie(c),break,7if (flag =- false) (Cookie cookie=new Cookie("lastTime",thisAccessTime);cookie.setMaxAge(Integer.MAXVALUE);response.addCookie(cookie);response.getWriterO).write("您好,欢迎您首次访问本网站!"),7教学设计:讲解session时,尤其是它的工作原理,可与Cookie相比较。同样,在讲解如何使用Session保存用户信息时,借助场景实例边演示边讲解,有助于学生掌握。思政元素:网络安全意识一一强调在互联网时代,个人信息保护的重要性,以及在Web开发中如何合理、安全地使用Session技术来保护用户隐私。(二)Session技术1.简介(1)定义Session是一种将会话数据保存到服务器的技术。当客户端访问服务器时,服务器通过教学组织Session机制记录客户端信息。通常存储在服务器端的内存或数据库中。过程3(2)工作原理(45分钟)客户端每次请求时,服务器会为其分配一个唯一的SessionID,并通过响应头或Cookie将SessionID返回给客户端。客户端后续请求时需带上该SessionID,服务器根据SessionID检索对应的会话信息。发送第一次请求时,服务创建Session客户服务将Session的ID放入Cookie,响应输客户端端馨后续访间,通过Cookie将Session的ID提交(3)应用场景:用户身份验证、会话状态管理等。(4)安全性考虑:Session超时设置、Session固定攻击防御等。2.javax.servlet.http.HttpSession类
System.out.println(name + ": " + c.getValue()); if ("lastTime".equals(name)) { flag = true; String vString = c.getValue(); String lastTime = URLDecoder.decode(vString, "utf-8"); response.getWriter().write("欢迎回来,您上次访问的时间是:" + lastTime); c.setValue(thisAccessTime); c.setMaxAge(60 * 60 * 24 * 30); response.addCookie(c); break; } } if (flag == false) { Cookie cookie = new Cookie("lastTime", thisAccessTime); cookie.setMaxAge(Integer.MAX_VALUE); response.addCookie(cookie); response.getWriter().write("您好,欢迎您首次访问本网站!"); } } } 教学组织 过程 3 (45 分钟) 教学设计: 讲解 session 时,尤其是它的工作原理,可与 Cookie 相比较。同样,在讲解如何使 用 Session 保存用户信息时,借助场景实例边演示边讲解,有助于学生掌握。 思政元素:网络安全意识——强调在互联网时代,个人信息保护的重要性,以及在 Web 开发中如何合理、安全地使用 Session 技术来保护用户隐私。 (二)Session 技术 1. 简介 (1)定义 Session 是一种将会话数据保存到服务器的技术。当客户端访问服务器时,服务器通过 Session 机制记录客户端信息。通常存储在服务器端的内存或数据库中。 (2)工作原理 客户端每次请求时,服务器会为其分配一个唯一的 Session ID,并通过响应头或 Cookie 将 Session ID 返回给客户端。客户端后续请求时需带上该 Session ID,服务器根据 Session ID 检索对应的会话信息。 (3)应用场景:用户身份验证、会话状态管理等。 (4)安全性考虑:Session 超时设置、Session 固定攻击防御等。 2. javax.servlet.http.HttpSession 类

每个来访者对应一个HttpSession类的对象,所有关于该来访者的状态信息都保存在这个HttpSession对象里。(1)获取HttpSession对象HttpServletRequest类提供了获取HttpSession对象的方法,具体语法格式如下。public Httpsession getSession()public HttpSession getSession(Boolean create)不同的是,在调用getSession方法时,如果当前请求没有关联HttpSession对象,则新建一个HttpSession对象并返回:在调用getSession(Booleancreate)方法时,如果当前请求没有关联HttpSession对象,当参数为True时,会新建一个HttpSession对象并返回:当参数为False时,返回Null。(2)HttpSession类的常用API1)setMaxInactivelnterval方法当客户端第一次访问Web应用时,服务器就会创建一个HttpSession对象。如果客户端超过一定时间后没有再次访问该Web应用,服务器就会把对应的HttpSession对象销毁,setMaxlnactivelnterval()方法即用于设置Session的有效时间,单位为秒。2)setAttribute(方法、getAttribute(方法、removeAttribute(方法在一次会话范围内,Session对象可以作为存取数据的容器,以上三个方法分别可以完成对数据的添加、获取和移除。数据以key/value的形式存储在Session内,其中,key为String类型,value为任意类型,通常是一个Object对象。在获取或移除数据时,只需传入String类型的key即可。3.Session生命周期Session的生命周期是指一个HttpSession对象从创建到销毁的过程。(1)Session生效在以下情况下,服务器会创建一个HttpSession对象。①:客户端首次访问Web应用。②服务器为客户端创建的Session已被销毁,客户端再次访问Web应用。③HttpSession对象生成后,只要客户端继续访问,服务器就会不断地更新它的最后访问时间并认为该HttpSession对象“活跃”了一次。随着访问者的不断增多,HttpSession对象也越来越多,为了防止内存溢出,服务器会将超过一定时间没有“活跃”的HttpSession对象销毁。注意:Sessinon在用户第一次访问服务器时创建,需要注意只有访问JSP、Servlet等程序时才会创建Session。此外,还可调用request.getSession(true)强制生成Session。只访间HTML、IMAGE等静态资源并不会创建Session。(2)Session失效一一“超时限制”判断Session是否生效Web服务器采用“超时限制”判断客户端是否还在继续访问。在一定时间内,如果某个客户端一直没有请求访问,那么,Web服务器就会认为该客户端已经结束请求,并且将与该客户端会话所对应的HttpSession对象变成垃圾对象,等待垃圾收集器将其从内存中彻底清除。反之,如果浏览器超时后,再次向服务器发出请求访问,那么,Web服务器会创建一个新的HttpSession对象,并为其分配一个新的ID属性。(3)Session失效一一强制Session失效如果想让Session立即失效,直接调用HttpSession对象的invalidate()方法
每个来访者对应一个 HttpSession 类的对象,所有关于该来访者的状态信息都保存在这 个 HttpSession 对象里。 (1)获取 HttpSession 对象 HttpServletRequest 类提供了获取 HttpSession 对象的方法,具体语法格式如下。 不同的是,在调用 getSession() 方法时,如果当前请求没有关联 HttpSession 对象,则 新建一个 HttpSession 对象并返回;在调用 getSession(Boolean create) 方法时,如果当前请 求没有关联 HttpSession 对象,当参数为 True 时,会新建一个 HttpSession 对象并返回;当 参数为 False 时,返回 Null。 (2)HttpSession 类的常用 API 1)setMaxInactiveInterval()方法 当客户端第一次访问 Web 应用时,服务器就会创建一个 HttpSession 对象。如果客户 端超过一定时间后没有再次访问该 Web 应用,服务器就会把对应的 HttpSession 对象销毁, setMaxInactiveInterval()方法即用于设置 Session 的有效时间,单位为秒。 2)setAttribute()方法、getAttribute()方法、removeAttribute()方法 在一次会话范围内,Session 对象可以作为存取数据的容器,以上三个方法分别可以完成对 数据的添加、获取和移除。数据以 key/value 的形式存储在 Session 内,其中,key 为 String 类型,value 为任意类型,通常是一个 Object 对象。在获取或移除数据时,只需传入 String 类型的 key 即可。 3. Session 生命周期 Session 的生命周期是指一个 HttpSession 对象从创建到销毁的过程。 (1)Session 生效 在以下情况下,服务器会创建一个 HttpSession 对象。 1 客户端首次访问 Web 应用。 2 服务器为客户端创建的 Session 已被销毁,客户端再次访问 Web 应用。 3 HttpSession 对象生成后,只要客户端继续访问,服务器就会不断地更新它的最后 访问时间并认为该 HttpSession 对象“活跃”了一次。随着访问者的不断增多,HttpSession 对象也越来越多,为了防止内存溢出,服务器会将超过一定时间没有“活跃”的 HttpSession 对象销毁。 注意:Sessinon 在用户第一次访问服务器时创建,需要注意只有访问 JSP、Servlet 等 程序时才会创建 Session。此外,还可调用 request.getSession(true)强制生成 Session。只访 问 HTML、IMAGE 等静态资源并不会创建 Session。 (2)Session 失效——“超时限制”判断 Session 是否生效 Web 服务器采用“超时限制”判断客户端是否还在继续访问。在一定时间内,如果某 个客户端一直没有请求访问,那么,Web 服务器就会认为该客户端已经结束请求,并且将 与该客户端会话所对应的 HttpSession 对象变成垃圾对象,等待垃圾收集器将其从内存中彻 底清除。反之,如果浏览器超时后,再次向服务器发出请求访问,那么,Web 服务器会创 建一个新的 HttpSession 对象,并为其分配一个新的 ID 属性。 (3)Session 失效——强制 Session 失效 如果想让 Session 立即失效,直接调用 HttpSession 对象的 invalidate()方法

HttpSession session =request.getSessionO;session.invalidate(://注销该request的所有session有时默认的Session失效时间并不能满足我们的需求。这时我们需要自定义Session的失效时间,自定义Session的失效时间有3种:1)在项目的web.xml文件中配置Session的失效时间,具体代码如下所示:30需要注意的是,在webxml配置的Session失效时间默认是分钟,所以上述代码设置Session失效时间为3o分钟。如果将元素中的时间值设置成0或负数,则表示会话永不超时。需要注意的是lconflweb.xml文件对站点内的所有Web应用程序都起作用。2)在Servlet程序中手动设置Session的失效时间,具体代码如下所示:session.setMaxlnactivelnterval(30*60);//设置单位为秒,设置为-1永不过期4.Session的应用大家应该对电商网站的购物车很熟悉,用户先将商品添加进购物车,然后再提交计算商品总金额,接下来通过一个案例使用Session模拟购物车的功能。(1)新建一个Servlet类TestSessionO1,添加如下代码。response.setContentType("text/html;charset=UTF-8");PrintWriterout=response.getWriterOHttpSessionsession=request.getSessionO,l从session中获取购物车,如果返回null,就创建一个购物车对象HashMap(HashMap)shoppingCar=session.getAttribute("shoppingCar"),1if(null-shoppingCar)shoppingCar=newHashMapStringbookNums=request.getParameterValues("book")if(null/=bookNums&&bookNums.length>0)li如果购物车不为空String bookName=null:for(StringbookNum:bookNums)(//遍历数组,根据书的序号配置书的名称switch(bookNum)break,case"1":bookName="Java语言程序设计";case"2":bookName="JavaWeb开发实战";break;case"3":bookName="JavaEE(SSM框架)企业应用实战";breakdefault:break,1判断该书是否在购物车中,如果在,数据加1,如果不在,增加一个条目if(shoppingCar.containsKey(bookName)shoppingCar.put(bookName, shoppingCar.get(bookName)+1);lelsefshoppingCar.put(bookName,1),3/将修改后的购物车重新装入Session对象session.setAttribute("shoppingCar",shoppingCar)response.sendRedirect("TestSession02");//将请求重定向到TestSession02(2)新建一个Servlet类TestSession02,用于展示购物车内的所有商品,具体代码如下:response.setContentType("text/html;charset-UTF-8")PrintWriterout=response.getWriterO
有时默认的 Session 失效时间并不能满足我们的需求。这时我们需要自定义 Session 的 失效时间,自定义 Session 的失效时间有 3 种: 1)在项目的 web.xml 文件中配置 Session 的失效时间,具体代码如下所示: 需要注意的是,在 web.xml 配置的 Session 失效时间默认是分钟,所以上述代码设置 Session 失效时间为 30 分钟。如果将元素中的时间值设置成 0 或负数,则 表示会话永不超时。 需要注意的是\conf\web.xml 文件对站点内的所有 Web 应用程序都 起作用。 2)在 Servlet 程序中手动设置 Session 的失效时间,具体代码如下所示: session.setMaxInactiveInterval(30 * 60); //设置单位为秒,设置为-1 永不过期 4. Session 的应用 大家应该对电商网站的购物车很熟悉,用户先将商品添加进购物车,然后再提交计算 商品总金额,接下来通过一个案例使用 Session 模拟购物车的功能。 (1)新建一个 Servlet 类 TestSession01,添加如下代码。 response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); HttpSession session = request.getSession(); //从 session 中获取购物车,如果返回 null,就创建一个购物车对象 HashMap shoppingCar = (HashMap) session.getAttribute("shoppingCar"); if(null == shoppingCar){ shoppingCar = new HashMap<>(); } String[] bookNums = request.getParameterValues("book"); if(null != bookNums && bookNums.length>0){ //如果购物车不为空 String bookName = null; for(String bookNum: bookNums){//遍历数组,根据书的序号配置书的名称 switch (bookNum) { case "1": bookName = "Java 语言程序设计"; break; case "2": bookName = "Java Web 开发实战"; break; case "3": bookName = "Java EE(SSM 框架)企业应用实战"; break; default: break; } //判断该书是否在购物车中,如果在,数据加 1,如果不在,增加一个条目 if(shoppingCar.containsKey(bookName)){ shoppingCar.put(bookName, shoppingCar.get(bookName) + 1); }else{ shoppingCar.put(bookName, 1); } } } //将修改后的购物车重新装入 Session 对象 session.setAttribute("shoppingCar", shoppingCar); response.sendRedirect("TestSession02");//将请求重定向到 TestSession02 (2)新建一个 Servlet 类 TestSession02,用于展示购物车内的所有商品,具体代码如下: response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter();

HttpSessionsession=request.getSession(),HashMapshoppingCar(HashMap)二session.getAttribute("shoppingCar")if(null/=shoppingCar&&shoppingCar.size(O>0)out.println("您购买的书籍有:");for(StringbookName:shoppingCar.keySet())out.println(bookName +":"+ shoppingCar.get(bookName)+"本");7lelse!out.println(您还没有购买任何书籍")out.println("继续购买");(3)在工程的WebContent目录下新建一个buy.html文件,该文件用于向用户显示可以选择的书籍,添加如下代码。请选择您需要的书籍Java语言程序设计JavaWeb开发实战JavaEE(SSM框架)企业应用实战第一次运行TestSessioin02的结果:回Xhtp:/localhost:8080/chapter08/testssion02pCx★容360导航新一代安全_localhostx文件(F)搞摄(日重看()收款卖(A)工具(T)帮助(H)你还没有购买任何书籍!批换购卖点击“继续购买”后进入buy.html页面:e回xhttp:/localhost:808o/chaptero8/buy.htm0·Cx价★女buyx文件(日编锁(E)吉着O收靠夹(A)工具(D帮斯(H)请选择您需要的书籍口a语言程序设计Jaaweb开发实战JmaEE(SSM框架)企业应用实战在buy.html页面中选中需要的图书后单击“提交”按钮后的结果:-hiup:/localhost:8080/chaptero8/TestSession020CX★locathost文件日编银日香看V收震美A)工具格助你购买的书箱有:JaaWeb开发实战1本JmaE(SSM框美)企业应用实战:本高程序设计1本找热购
HttpSession session = request.getSession(); HashMap shoppingCar = (HashMap) session.getAttribute("shoppingCar"); if(null != shoppingCar && shoppingCar.size()>0){ out.println("您购买的书籍有:"); for(String bookName: shoppingCar.keySet()){ out.println(bookName + ": " + shoppingCar.get(bookName) + "本"); } }else{ out.println("您还没有购买任何书籍"); } out.println("继续购买"); (3)在工程的 WebContent 目录下新建一个 buy.html 文件,该文件用于向用户显示可以选 择的书籍,添加如下代码。 请选择您需要的书籍 Java 语言程序设计 Java Web 开发实战 Java EE(SSM 框架)企业应用实 战 第一次运行 TestSessioin02 的结果: 点击“继续购买”后进入 buy.html 页面: 在 buy.html 页面中选中需要的图书后单击“提交”按钮后的结果:

【课堂练习】:应用Session对象模拟用户登录。当用户访问某个网站的首界面时,首先会判断用户是否登录,如果已经登录则在首界面中显示用户登录信息,否则进入登录页面,完成用户登录功能,然后显示用户登录信息。在用户登录的情况下,如果单击用户登录界面中的“退出”时,就会注销当前用户的信息,返回首界面。0回localhosta080/chapero5/ndx+D localhot8080/chupter05/nd: x+←→C@localhost:8080/chaptero5/lindexSermo★e←→Clocalnost:8DBo/chaptero5/ndesServlete☆您已登录,欢迎你,itcast!返出您还没有登录,请登量5.URL重写技术URL重写,是将URL重新写成Web应用可以处理的另一个URL的过程。前文讲到,服务器在传递Session的ID属性时,是以Cookie的形式传递的。在实际应用中,如果客户端不支持Cookie或禁用Cookie功能,那么服务器就无法获取Session的ID属性,也无法获取与该客户端对应的Session对象。为了解决这个问题,URL重写技术被引入到Session机制中。在无法得知客户端是否支持Cookie功能时,将Seesion的ID属性追加到URL地址的后面,从而实现会话跟踪功能。例如,对于如下格式的请求地址。http:localhost:8080/chapter08/TestSession03经过URL重写后,地址格式变为如下格式:http:localhost:8080/chapter08/TestSession03;jsessionid=2046864EAF60其中,jsessionid即为追加的Session的ID属性。HttpServletResponse类提供了重写URL的方法,具体格式如下:public String encodeURL()public String encodeRedirectURL()这两种方法会根据请求内容判断客户端是否支持Cookie,如果客户端支持Cookie,会将URL原封不动地输出,如果客户端不支持Cookie,会将用户Session的ID追加到URL后面。其中,encodeURLO方法用于对超链接和Form表单中action属性的URL地址进行重写,encodeRedirectURLO方法用于对页面重定向的URL地址进行重写。【案例】演示URL重写技术,具体步骤如下:(1)打开浏览器,单击右上方的“工具”按钮,在弹出的菜单中选择“Internet选项”命令,在打开的对话框中选择“隐私”选项卡,将“设置”选项中的Cookie权限修改为“阻止所有Cookie”,如图所示。单击“确定”按钮,此时,浏览器的所有Cookie都被禁用。(2)新建一个TestSessionO3类,添加代码如下。response.setContentType("text/html;charset-utf-8");PrintWriter out= response.getWriterO,HttpSessionsession=request.getSession();//获取Session对象URL重写I/String encodeURL=response.encodeURL("/TestSession04");StringencodeURL=response.encodeRedirectURL("TestSession04");/向客户端响应一个当前Session的IDout.print("已创建一个Session对象,ID为:"+session.getld(+""),//向客户端响应一个重写的URIout.print("访问TestSession04")
【课堂练习】:应用 Session 对象模拟用户登录。当用户访问某个网站的首界面时, 首先会判断用户是否登录,如果已经登录则在首界面中显示用户登录信息,否则进入登录 页面,完成用户登录功能,然后显示用户登录信息。在用户登录的情况下,如果单击用户 登录界面中的“退出”时,就会注销当前用户的信息,返回首界面。 5. URL 重写技术 URL 重写,是将 URL 重新写成 Web 应用可以处理的另一个 URL 的过程。前文讲到, 服务器在传递 Session 的 ID 属性时,是以 Cookie 的形式传递的。在实际应用中,如果客 户端不支持 Cookie 或禁用 Cookie 功能,那么服务器就无法获取 Session 的 ID 属性,也无 法获取与该客户端对应的 Session 对象。为了解决这个问题,URL 重写技术被引入到 Session 机制中。在无法得知客户端是否支持 Cookie 功能时,将 Seesion 的 ID 属性追加到 URL 地址的后面,从而实现会话跟踪功能。 例如,对于如下格式的请求地址。 经过 URL 重写后,地址格式变为如下格式: 其中,jsessionid 即为追加的 Session 的 ID 属性。 HttpServletResponse 类提供了重写 URL 的方法,具体格式如下: 这两种方法会根据请求内容判断客户端是否支持 Cookie,如果客户端支持 Cookie,会 将 URL 原封不动地输出,如果客户端不支持 Cookie,会将用户 Session 的 ID 追加到 URL 后面。其中,encodeURL()方法用于对超链接和 Form 表单中 action 属性的 URL 地址进行 重写,encodeRedirectURL()方法用于对页面重定向的 URL 地址进行重写。 【案例】演示 URL 重写技术,具体步骤如下: (1)打开浏览器,单击右上方的“工具”按钮,在弹出的菜单中选择“Internet 选项”命 令,在打开的对话框中选择“隐私”选项卡,将 “设置”选项中的 Cookie 权限修改为“阻 止所有 Cookie”,如图所示。单击“确定”按钮,此时,浏览器的所有 Cookie 都被禁用。 (2)新建一个 TestSession03 类,添加代码如下。 response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); HttpSession session = request.getSession(); //获取 Session 对象 //URL 重写 //String encodeURL = response.encodeURL("/TestSession04"); String encodeURL = response.encodeRedirectURL("TestSession04"); //向客户端响应一个当前 Session 的 ID out.print("已创建一个 Session 对象,ID 为:"+session.getId()+""); //向客户端响应一个重写的 URL out.print("访问 TestSession04");