教案课程名称授课教师黄潇《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("<html><head><title>商品列表</title></head><body><ul><li>"),out.println("<ahref-\"TestCookie03?itemNum=01\">商品01</a></li><li>");out.println("<ahref-\TestCookie03?itemNum=02\">商品02</a></li><li>");out.println("<ahref=\"TestCookie03?itemNum=03)">商品03</a></li><li>");out.println("<ahref-}"TestCookie03?itemNum=04\">商品04</a></li></ul>")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("<html><head><title>商品列表</title></head><body><ul><li>"); out.println("<a href=\"TestCookie03?itemNum=01\">商品 01</a></li><li>"); out.println("<a href=\"TestCookie03?itemNum=02\">商品 02</a></li><li>"); out.println("<a href=\"TestCookie03?itemNum=03\">商品 03</a></li><li>"); out.println("<a href=\"TestCookie03?itemNum=04\">商品 04</a></li></ul>"); 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("</body></html>");【课堂练习】:显示用户上次访问时间。当用户访问某些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("</body></html>"); 【课堂练习】:显示用户上次访问时间。 当用户访问某些 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();