




已阅读5页,还剩31页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2020年1月15日 1 第九章使用会话追踪 2020年1月15日 2 本节课的内容 什么是客户会话会话的工作机制维护会话的几种方式跟踪客户会话使用HttpSession对象维护会话信息监视会话对象 2020年1月15日 3 典型的在线商店的情况 用户刚刚在一个页面中挑选到一种商品 添加到购物车中 在下一个商品页面中又挑选到一种添加到购物车中 注意到这两次选择是在不同的HTTP连接中发生的 而用户希望两次挑选的商品在同一个购物车中一起交付 而不是每选一件商品都要交付一次 这就需要一种机制来唯一的标识用户 以便跟踪客户在站点中的行为 会话 这种在多次HTTP连接间维护用户与同一用户发出的不同请求之间关联的情况称为维护一个会话 session 1 什么是会话 2020年1月15日 4 2 会话的特征会话能够把用户与同一用户发出的不同请求之间关联起来 不同用户的会话应当是相互独立的 会话一旦建立就应当一直存在 直到用户空闲时间超过了某一个时间界限 容器才应当释放该会话资源 在会话的存活期间 用户可能给服务器发送了很多请求 该用户的这些请求信息都可以存储在会话中 2020年1月15日 5 网上购物商店的购物车 3 会话的工作机制 用户输入个人信用信息登录到网上商店 商店为用户创建一个独一无二的 用户独有的会话对象 购物车 用户浏览产品页 察看商品介绍 并点击 加入 按钮 商品信息在一次HTTP连接中传递到服务器 在服务器 该商品的相关信息保存在用户的会话对象中 当用户离开网上商店前 被询问是否购买 当用户选择 YES 确认购买时 服务器会将会话对象中的商品信息保存到数据库中 并联系网上银行和邮局向用户发货 2020年1月15日 6 在上述的网上商店中 用户的会话信息保存在服务器端 用户与服务器之间必须提供一种机制 标识某一用户与他在服务器端用户状态之间的对应关系 这种机制必须保证 允许用户在不同页面 如 Servlet 间浏览而不会丢失 购物车 必须避免不同用户的 购物车 混淆 用户不会允许自己为别的用户付款 不幸的是通常情况下Web服务器不会自动跟踪用户操作轨迹 捕获并存储用户轨迹是Web应用开发人员的工作 2020年1月15日 7 客户第一次访问网站时 将会话信息添加到由服务器发出的每一个响应的URL中 当用户再次访问网站时 URL中会把这个会话信息作为用户请求参数返回服务器端 服务器根据返回的会话信息来标识该客户 维护整个会话的信息持续性 常见的URL重写格式为了保持URL的简洁 通常这个嵌在URL中的会话信息是一个由服务器生成的代表客户的唯一性的ID号 在URL的表现形式上 它通常是作为URL查询参数的形式出现的 如 http ch09 huihua jsp sessionid 678 4 维护会话的方式 URL重写 2020年1月15日 8 Session jspTom jspJerry jsp 2020年1月15日 9 URL重写技术的优点 用户是匿名的 在Web服务器实现上得到普遍的支持 URL重写技术的缺点 由于会话信息作为查询参数在URL上是可见的 因此会话存在一定的安全隐患 需要对所有动态生成的URL进行重写 代码比较繁琐 只能用于动态产生的文档如Servlet和JSP页面 而不能用于HTML文档 重写的URL不能长期有效 2020年1月15日 10 隐藏窗体技术原理HTML表单允许把一些字段信息隐藏起来 而在浏览器上不被显示出来 例如 使用隐藏窗体技术实现会话管理这种方式的工作机制为 在用户第一次请求时 服务器在为客户准备的页面上添加一个或多个隐藏表单 把一些要隐藏的信息如标识该客户的ID号存储在那里 当客户提交该表单时 这些信息会作为查询参数返回服务器 服务器可以利用HttpServletRequest对象的getParameter 方法读取出来 这样就达到了在服务器端维护会话信息持续的作用 5 隐藏窗体技术 2020年1月15日 11 可以这样认为 同重写URL技术相比 隐藏窗体技术在表单参数中传递会话信息 而重写URL技术是在GET参数中传递会话信息 除了这点 二者并无根本区别 2020年1月15日 12 上面我们分别说明了如何使用URL重写 cookie和隐藏表单这三种方式来跟踪用户会话 不管采用何种方式 都应实现以下步骤 1 服务器必须为每个会话产生一个唯一的ID号2 在服务器和客户浏览器之间传递这个ID号以维持会话3 服务器端根据ID号维护相关客户的会话信息 2020年1月15日 13 Servlet2 3规范定义了一个HttpSession接口 允许Servlet容器针对每一个用户建立一个HTTP会话 即HttpSession对象 每个HTTP会话将会自动被赋予一个唯一的会话编号 sessionID 而无需程序员编程实现 HttpSession对象提供了和ServletContext对象相似的一组会话属性的方法 这样就可以很容易地在服务器端存放用户会话状态 6 使用内建的Session对象 2020年1月15日 14 2020年1月15日 15 会话和请求之间的关系会话维护的就是同一用户的一组请求序列之间的关联性 因此 请求对象和会话对象之间必然存在一定的关系 换言之 对于Servlet而言 当它处理不同用户发来的不同HttpServletRequest时 应该有能力判断该请求所属的HttpSession 会话与请求的关系 这些请求属于一个会话 因为它们是同一个用户发往同一个服务器应用程序 Helloworld 的 即使它们是发往不同的Servlet的 当用户在Helloworld下不同的Servlet间浏览时 服务器可以用会话对象跟踪与用户有关的状态 这些请求属于另一个会话 代表不同的用户 这些请求可以与上面的请求同时发生而不会被Servlet混淆 2020年1月15日 16 获取与请求关联的会话对象HttpServletRequest对象提供了getSession方法 通过这个方法 Servlet就可以获得与当前请求关联的会话对象的引用 该方法为重载的方法 有两个版本 publicHttpSessiongetSession 返回与当前请求相关联的会话 如果当前请求还没有一个相关联的会话 就创建一个并返回 publicHttpSessiongetSession boolbCreate 返回与当前请求相关联的会话对象 如果没有 且参数create的值为true 则创建并返回一个新的会话 如果create的值为false 且请求没有相关联的会话对象 将返回null 可以利用这点判断用户是否为第一次访问站点 如果getSession false 返回null 则表示用户是第一次访问站点 如果返回非null则表示用户不是第一次访问站点 会话与请求的关系 2020年1月15日 17 获取与请求关联的会话对象HttpSessions request getSession Stringsid s getId if s isNew out println 新的会话ID sid else out println 欢迎回来 User sid 会话与请求的关系 总是返回一个会话 但是我们不知道该会话是新建的还是已有的 获得会话ID并保存到字符串中 该串将类似于 32FE24119D28C30866C9EF4BEA40EF4E 判断会话是新建的还是旧的 2020年1月15日 18 会话IDservlet容器在创建每一个新的HTTP会话对象时 都会赋予一个新的ID号 servlet容器保证它在Web应用范围内是唯一的 会话ID是实际包含在Http请求 响应报文中的会话数据 这个ID号可以通过HttpSession对象的getId 获得 例如 HttpSessionsession request getSession StringsessionId session getId 会话与请求的关系 2020年1月15日 19 HttpSession工作原理当用户第一次发出请求时 Servlet容器会建立一个HttpSession对象 并自动分配一个Web应用范围内唯一的SessionID与之对应 这个SessionID也会随着HTTP响应内容传递给用户端浏览器 传递的方式默认情况下为cookie 如果用户端浏览器关闭了cookie功能 就会使用URL重写技术传递给用户浏览器 在用户发出的后续请求中 请求信息中会包含Servelt容器传递给它的SessionID Servlet容器就会根据传回的SessionID将原来建立的HttpSession对象将请求与HttpServletRequest对象关联起来 所以 对于同一个用户 调用getSession 方法返回的将是同一个HttpSession对象 会话与请求的关系 2020年1月15日 20 与ServletContext对象类似 我们可以给HttpSession对象绑定属性 ServletContext对象的属性的作用域是Web应用程序 在这个应用程序下的所有Servlet都共享这些属性 绑定到HttpSession对象上的属性只在一次会话周期内有效 且只有在属于该会话的HttpRequest对象中才可以访问这些属性 换句话说 会话属性就是特定用户的专用数据 同时访问Web应用的其他用户无法访问这些属性 HttpSession对象的属性 2020年1月15日 21 返回由name指定的会话属性 如果name指定的属性不存在将返回null 例如 在同一用户的会话有效期内的其他地方 我们可以把绑定到HttpSession对象上的对象取出来 HttpSessionsession request getSession true Accountacct session getAttribute account 删除由name指定的HttpSession对象的会话属性 如果由name指定的属性不存在 方法将直接返回 例如 HttpSessionsession request getSession true session removeAttribute account HttpSession接口使用以下方法管理绑定到会话的属性voidsetAttribute Stringname Objectvalue ObjectgetAttribute Stringname voidremoveAttribute Stringname HttpSession接口方法 访问属性 将一个对象绑定到HttpSession对象 使之成为HttpSession对象的一个会话属性 调用时由value指定的对象将变成其name属性 如果name属性已经存在 它原来对应的对象将由vlaue指定的对象置换掉 Accountacct newAccount HttpSessionsession request getSession true session setAttribute account acct session setAttribute account newInteger 100 2020年1月15日 22 publicvoiddoGet HttpServletRequestrequest HttpServletResponseresponse intvisitCount HttpSessionsession request getSession false if session null visitCount 1 session request getSession true session setAttribute visitCount newInteger visitCount else visitCount Integer session getAttribute visitCount intValue visitCount session setAttribute visitCount newInteger visitCount out println No oftimesvisited visitCount HttpSession接口方法 访问属性 用false参数获取现有会话对象 若没有 则创建一个新的会话 并将visitCount对象绑定到该会话名为 visitCount 的属性 注意绑定到会话属性的对象类型只能为Object类型 即可以是null int double boolean以外的类型 注意在本例中newInteger visitCount 的用法 若存在会话 则从该会话提取名为 visitCount 的绑定对象 更新其值后 重新绑定到会话 2020年1月15日 23 如果要终止某个HTTP会话 可以使用下面的几种方式publicvoidinvalidate 方法publicvoidsetMaxInactiveInterval intinterval 方法在web xml中配置会话的生存时间 HttpSession接口方法 终止会话 调用该方法将终止某个HTTP会话 之后如果尝试向这个会话绑定属性 将会得到一个IllegalStateException异常 例如 HttpSessionsession request getSession true session invalidate Accountacct newAccount session setAttribute account acct 本句抛出IllegalStateException 设置HTTP会话的超时时间 单位为秒 例如 HttpSessionsession request getSession true session setMaxInactiveInterval 600 在本示例中 如果用户访问本Web应用程序的间隔超过了10分钟 容器将终止该会话 如果interval的值为负数 HTTP会话将永不超时 除非容器被关闭 否则这个HTTP会话会一直存在于内存之中 我们还可以在web xml文件中设定所有HTTP会话的超时时间 可在元素下 用子元素指定 单位为分钟 30在示例中 如果在程序中没有另外指定 Web应用程序中的某一会话对应的用户访问间隔超过30分钟 容器将关闭该会话 2020年1月15日 24 对于网上商店这样的应用 可能希望对 商店 中当前的客人总数进行监控 根据前面所学内容 我们知道应该利用会话来实现该功能 在本节中 我们将学习利用HttpSessionListener侦听器 轻松实现一个计数器 以跟踪并向用户显示本网站的在线人数 监视会话对象 2020年1月15日 25 监视会话对象 4 3节 会话侦听器是用来监听会话事件的监听器类 同其他Web侦听器类似 会话侦听器由用户编写并注册到web应用中 当容器检测到某个会话有事件发生时 容器将激活监听器对象并激发对应的事件方法 主要有两类会话侦听器 会话生命周期侦听器同ServetContextListener类似 这类侦听器主要负责会话生命周期事件的监听 如会话的生成 结束 激活等 在Servlet规范中 可以通过实现接口HttpSessionListener和HttpSessionActivationListener来实现侦听 会话属性侦听器同ServetContextAttributeListener类似 这类侦听器负责处理绑定到会话的属性的更改事件 如绑定 删除 修改等 这类侦听器应实现HttpSessionAttributeListener或HttpSessionBindingListener接口 监视会话对象 会话事件 2020年1月15日 26 一 会话生命周期事件 监视会话对象 4 3节 会话的生命周期是由Servlet容器管理的 在会话生命周期中 容器会有各种关于会话的事件产生 为了处理这些事件 我们需要做的是实现监听器接口并在web xml文件中注册这些类 当容器发现某个会话的状态发生变化时 如生成 池化 激活 销毁 容器会将一个SessionEvent对象作为参数调用注册的监听器 2020年1月15日 27 监视会话对象 4 3节 对于本节要完成的任务 我们利用会话的生命周期事件来实现当前在线人数的统计工作 当一个用户登录网站时 容器将创建一个会话 这时可以将在线人数计数器加1 当用户超时 注销时 容器认为该会话失效 在线人数计数器减1 当容器创建或销毁会话时 容器会通知HttpSessionListener侦听器 HttpSessionListener接口定义了两个方法 我们可在这两个方法种实现对计数进行增减的代码 publicvoidsessionCreate HttpSessionEventsce publicvoidsessionDestroyed HttpSessionEventsce HttpSessionListener侦听器 当容器生成一个新会话时会通知HttpSessionListener侦听器调用本方法 容器向该方法传递的参数是HttpSessionEvent对象 它表示一个会话生命周期事件 它只有一个方法 供侦听器获得对当前会话对象的引用 publicHttpSessiongetSession 当某个会话超时或者调用了invalidate 方法都会引起会话的销毁 在会话销毁之前 容器会通知HttpSessionListener侦听器并调用本方法 同样 容器向该方法传递的参数是HttpSessionEvent对象 侦听器可通过其getSession 方法引用发生事件的会话对象 2020年1月15日 28 监视会话对象 4 3节 注意事项 当实现HttpSessionListener侦听器时 必须同时提供sessionCreate sessionDestroyed的实现 当仅仅需要侦听一个事件时 另一个事件方法可用空方法体 但必须实现 通过从参数得到的HttpSessionEvent引用 在sessionCreate方法和sessionDestroyed方法内可以获得发生事件的会话的引用 除此之外 HttpSessionEvent参数并不提供其他信息 与ServletContextListener类似 这两个方法可能会遇到多线程同步问题 HttpSessionListener侦听器 2020年1月15日 29 publicvoidcontextInitialized ServletContextEventsce ServletContextcontext sce getServletContext Integercounter newInteger 0 context setAttribute counter counter publicvoidcontextDestroyed ServletContextEventsce ServletContextcontext sce getServletContext context removeAttribute counter publicvoidsessionCreated HttpSessionEventse HttpSessionsession se getSession false ServletContextcontext session getServletContext Integercounter Integer context getAttribute counter counter newInteger counter intValue 1 context setAttribute counter counter publicvoidsessionDestroyed HttpSessionEventse HttpSessionsession se getSession ServletContextcontext session getServletContext Integercounter Integer context getAttribute counter counter newInteger counter intValue 1 context setAttribute counter counter publicclassOnlineCounterListener 实现ServletContextListener接口 以侦听应用程序启动 停止事件 由于所有的用户都可以看到当前在线人数 因此计数器对象应当是在整个Web应用中共享的 我们可以把它设定为ServletContext属性 这样就能保证计数器对象能够让所有的用户访问 implementsServletContextListener HttpSessionListener 当容器每次进入一个新的会话时 从该会话检索出所属的Web应用上下文 然后将其 counter 属性的值加1 注意 counter 属性是一个整型的 在整个Web应用运行期间维护的量 当容器每次删除一个会话时 说明有用户正在离开当前Web应用 从会话检索出所属Web应用上下文 然后将其 counter 属性的值减1 重新存入Web应用上下文 2020年1月15日 30 监视会话对象 4 3节 本例中的几个问题说明 四个方法的作用必须分清楚 contextInitialized负责在Web上下文中建立 counter 属性并设置初值 sessionCreated负责在新会话出现时将 counter 属性值增加sessionDestroyed负责在会话结束时将 counter 属性值减少contextDestroyed负责在Web应用结束前释放上下文属性所占资源 编写好事件侦听器后 还要注册到Web xml中才会生效 其中 1 会话失效时间长度com mycompany servlet OnlineCounterListener 事件类的全名在Web应用中的某个Servlet中 可以随时查询计数context this getServletContext request getSession true 若还未进入会话则创建一个 out println Online context getAttribute counter out println HttpSessionListener只能监听整个对象的生命周期 无法监听会话属性的添加 删除 保存等状态变动 监视这些信息 使用HttpSessionAttributeListener侦听器 HttpSessionListener侦听器 2020年1月15日 31 监视会话对象 4 3节 会话的一个主要作用就是在会话中存储可以在不同请求间维持的数据 会话属性侦听器实现以下接口来侦听会话对属性的添加 替换 删除等动作 HttpSessionAttributeListenerHttpSessionBindingListener 二 会话属性侦听器 当容器发现向某个会话的属性发生变化时 将向注册到Web应用的HttpSessionAttributeListener和HttpSessionBindingListener发送事件消息 以下动作会令会话产生属性事件 添加属性替换属性删除属性 侦听器是满足以下条件的Java类 实现HttpSessionAttributeListener或HttpSessionBindingListener接口注册到了Web XML下的节中在侦听器中的事件方法中 可以检查参数HttpSessionBindingEvent来获取发生事件的会话和属性 一般情况下 我们通过实现HttpSessionAttributeListener接口来实现侦听器而不是HttpSessionBindingListener接口 事件发生时 一个HttpSessionBindingEvent对象作为消息参数发送到侦听器 侦听器可以通过该参数获得会话 属性名等信息 2020年1月15日 32 监视会话对象 4 3节 HttpSessionAttributeListener接口共定义了三个方法 publicvoidattributeAdded HttpSessionBindingEventse 当使用HttpSession对象的setAttribute 方法添加一个新的会话属性时 容器会调用侦听器的这个方法 publicvoidattributeRemoved HttpSessionBindingEventse 当通过HttpSession对象的removeAttribute 方法删除一个会话属性时 容器会调用侦听器的这个方法 publicvoidattributeReplaced HttpSessionBindingEventse 当向HttpSession对象通过setAttribute 方法替换一个已经存在的会话属性时 容器会调用侦听器的这个方法 HttpSessionAttributeListener侦听器 2020年1月15日 33 监视会话对象 4 3节 HttpSessionBindingEvent对象当会话属性发生变更时 通知HttpSessionAttributeListener侦听器的事件为HttpSessionBindingEvent对象 HttpSessionBindingEvent类继承自HttpSessionEvent类 除了继承的getSession 方法 HttpSessionBindingEvent类还定义了两个方法 StringgetName 返回绑定到会话对象或解除绑定的属性的名称 ObjectgetValue 返回添加 替换或要删除的会话属性 HttpSessionAttributeListener侦听器 2020年1月15日 34 publicvoidattributeAdded HttpSessionBindingEventse HttpSessionsession se getSession ServletContextcontext session getServletContext context log Anattributenamed se getName se getValue added publicvoidattributeRemoved Ht
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 植保机转让合同范本
- 猪场转手出租合同范本
- 出兑押金合同范本
- 临时工人合同范本
- 出售泡沫机床合同范本
- 借钱合同范本模板简单
- 商铺转租合同范本简化
- 表面表面加工合同范本
- 外贸采购订单合同范本
- 小区维修合同范本简易
- 现场调试合同协议书模板
- DB65∕T 4791-2024 水工隧洞敞开式TBM施工技术规范
- 工行金库资产管理办法
- DG-TJ08-2144-2025 公路养护工程质量检验评定标准
- 医疗集团薪酬管理办法
- 北京医院神经外科护理团队介绍
- 现代畜牧专业教学标准(高等职业教育本科)2025修订
- 船务公司船舶管理制度
- 南京城墙介绍
- 2025年卫生系统招聘考试(公共基础知识)新版真题卷(附详细解析)
- 提高护理文书书写合格率
评论
0/150
提交评论