04会话跟踪ppt课件_第1页
04会话跟踪ppt课件_第2页
04会话跟踪ppt课件_第3页
04会话跟踪ppt课件_第4页
04会话跟踪ppt课件_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

JavaWeb编程技术 第4章会话跟踪 本章主要内容4 1会话管理4 2通过Cookie支持会话4 3URL重写与隐藏表单域 4 1会话管理 4 1 1理解状态与会话4 1 2会话管理机制4 1 3HttpSession接口4 1 4使用HttpSession对象4 1 5会话超时与结束 1 理解HTTP协议的无状态特性协议记住用户及其请求的能力称为状态 state 按这个观点 协议分成两种类型 1 有状态的2 无状态的HTTP协议是一种无状态的协议对服务器的每个请求和相应的响应都是作为一个分离的事务处理 连接过程 客户发出请求 服务器找到资源 向客户发送响应 然后断开连接 客户再次请求 服务器不能记住客户 4 1 1理解状态与会话 无状态的应用 信息检索应用 图书目录查询等有状态的需求 购物网站 需要记住客户 服务器如何区分不同的客户 使用会话实现无状态的HTTP页面变成有状态的Web应用 2 会话的概念会话 session 是客户与服务器之间的不中断的请求响应序列 对会话的每个请求 服务器能够识别出请求来自于同一个客户 当一个未知的客户向web应用程序发送第一个请求时就开始了一个会话 7 会话对象生存于服务器上会话自动通过cookie或URL重写与客户关联使用request getSession来得到会话后台 系统检查cookie或附加在URL上的额外信息看是否与之前存储的会话对象的键相匹配 若匹配 则返回该对象 若不匹配 则创建新的对象 指定一个cookie或URL信息作为它的键 并返回新创建的会话对象 会话的基本思想 4 1 2会话管理机制 HTTP 1 1200OKSet Cookie JSESSIONID 61C4F23524521390E70993E5120263C6Content Type text html POST bookstore selectBook doHTTP 1 1Host Cookie JSESSIONID 61C4F23524521390E70993E5120263C6 像银行账户 HttpSession对象 注意 容器不能使用客户的IP地址唯一标识客户 客户可能是通过局域网访问Internet 尽管在局域网中客户有一个IP地址 但对于服务器来说 客户的IP地址实际是路由器的IP地址 所以该局域网的所有客户的IP地址都相同 因此也就无法唯一标识客户 访问会话对象调用request getSession获取HttpSession对象 HttpSessionsession request getSession true 指定参数为true 则当session不存在时 自动创建一个新的session对象session在以下几种情况下不存在浏览器关闭session过期session被指定为不合法 4 1 3会话对象 HttpSession publicStringgetId publiclonggetCreationTime publiclonggetLastAccessedTime publicbooleanisNew publicServletContextgetServletContext 4 1 3会话对象 HttpSession接口 HttpSession对象除了表示会话外 还用来存储与会话相关的数据信息 电子商务网站的购物车就应该存储在会话对象上 将信息存入会话publicvoidsetAttribute Stringname Objectvalue 查找与会话相关联的信息publicObjectgetAttribute Stringname publicEnumerationgetAttributeNames publicvoidremoveAttribute Stringname 废弃会话数据调用removeAttribute废弃指定的值调用invalidate废弃整个会话及会话数据调用logout将会话从web服务器中注销 使用HttpSession对象通常需要三步 1 为客户创建或获得与请求关联的会话对象 2 在会话对象中添加或删除名 值对属性 3 如果需要可使会话失效 使用HttpSession对象 使用HttpServletRequest接口提供的getSession 方法 该方法有两种格式 publicHttpSessiongetSession booleancreate 如果没有与当前请求关联的会话对象 当参数为true时创建一个新的会话对象 当参数为false时返回null publicHttpSessiongetSession 15 session代码示范 HttpSessionsession request getSession SomeClassvalue SomeClass session getAttribute someID if value null value newSomeClass session setAttribute someID value doSomethingWith value ShowSessionServlet java 示例程序 显示客户访问计数的servlet 规定当用户在一个指定的期限内处于不活动状态时 就将用户的会话终止 这称为会话超时 sessiontimeout 可以在DD文件中设置会话超时时间 例如 30 会话超时与失效 单位是分钟 0或小于0的值表示会话永不过期 默认值是30分钟 使用HttpSession接口提供的其它方法 格式为 publicvoidsetMaxInactiveInterval intinterval publicintgetMaxInactiveInterval 取得或设置在未被访问的情况下多长时间应该将会话置为无效 单位时间 秒 1 表示会话永不超时invalidate 废弃当前的会话logout 废弃与用户相关联的所有会话 在购物车的例子中 我们希望在付款处理完成后结束会话 这样 当用户再发送请求时 就会创建一个购物车中不包含商品的新的会话 session会消耗内存资源程序调用HttpSession invalidate 距离上一次收到客户端发送的sessionid时间间隔超过了session的超时设置 服务器进程被停止 非持久session 20 例 使用HttpSession invalidate 方法使session失效 LogoutServlet的doGet 方法代码 当用户在 Logout 按钮或超链接上点击时调用该方法publicvoiddoGet HttpServletRequestreq HttpServletResponseres req getSession invalidate 将用户转发的主页面 一个猜数游戏的Servlet GuessNumberServlet java ssession和servletContext的比较 ssession是一次会话过程 是局部的servletContext可以理解为服务器端的一个共享空间 它可以被所有的客户端访问 是全局的 A B C是代表客户端的cookie 服务器端的A B C代表session D代表servletContext 例 用ssession实现页面访问次数 publicvoiddoGet HttpServletRequestrequest HttpServletResponseresponse throwsServletException java io IOException response setContentType text html HttpSessionsession request getSession Stringheading IntegeraccessCount Integer session getAttribute accessCount if accessCount null accessCount newInteger 0 heading Welcom Youarefirsttimetovisit else heading WelcomeBacker accessCount newInteger accessCount intValue 1 session setAttribute accessCount accessCount PrintWriterout response getWriter out println Thetitle heading out println Accesscount accessCount 例 用ServletContext实现页面访问次数 publicvoiddoGet HttpServletRequestrequest HttpServletResponseresponse throwsServletException java io IOException ServletContextservletContext this getServletContext IntegeraccessCount Integer servletContext getAttribute accessCount if accessCount null accessCount 0 else accessCount accessCount 1 servletContext setAttribute accessCount accessCount response setCharacterEncoding gb2312 PrintWriterout response getWriter out println 访问 accessCount 次 Servlet共享数据方法 1 HttpServletRequest对象的setAttribute和getAttribute方法仅在当前请求间的页面有效request setAttribute name 张三 设置对象request的属性response setContentType text html charset gb2312 PrintWriterout response getWriter out println 属性name的值为 request getAttribute name out close getServletContext getRequestDispatcher TestGetAttribute forward request response 2 HttpSession对象的setAttribute和getAttribute方法对整个会话过程有效 浏览器不关闭 3 ServletContext对象的setAttribute和getAttribute方法在整个Web应用程序都有效 26 set getAttribute 同一个请求 HttpServletRequestrequset setAttribute objectName anObject requset getAttribute objectName 同一个应用程序 ServletContextgetServletContext setAttribute objectName anObject getServletContext getAttribute objectName 同一个会话 HttpSession Servlet共享数据方法 27 Servlet对象 进一步理解会话 4 1 ServletA 28 Servlet对象 进一步理解会话 4 2 ServletA 29 Servlet对象 进一步理解会话 4 3 App1 30 Servlet对象 进一步理解会话 4 4 App1 4 2 1CookieAPI4 2 2向客户端发送Cookie4 2 3从客户端读取Cookie4 2 4Cookie属性设置4 2 5Cookie的安全问题 4 2通过Cookie支持会话 Cookie的英文原意是 点心 它是户访问Web服务器时 服务器在用户硬盘上存放的信息 好像是服务器送给客户的 点心 Cookie实际上是一小段的文本信息 思想servlet发送简单的名称和值到客户程序客户程序在访问同一站点时将名称和值返回cookie的典型应用在电子商务会话中标识用户记录用户名和密码对站点进行定制定向广告 cookie简介 CookieAPI 使用javax servlet http Cookie类 它的构造方法如下 publicCookie Stringname Stringvalue Cookie类的常用方法如下 publicStringgetName publicStringgetValue publicvoidsetValue StringnewValue publicvoidsetMaxAge intexpiry 设置Cookie在浏览器中的最长存活时间 单位为秒 如果参数值为负 表示并不永久存储Cookie 如果是0表示删除该Cookie publicintgetMaxAge 创建Cookie对象调用Cookie的构造函数 给出cookie的名称和cookie的值 二者都是字符串Cookiec newCookie username hacker 将Cookie放入到HTTP响应中response addCookie c 向客户端发送Cookie 36 向客户程序发送cookie设置最大时效要告诉浏览器将cookie存储到磁盘上 而非仅仅保存在内存中 使用setMaxAge 参数为秒数 c setMaxAge 60 60 24 7 Oneweek默认值是 1cookies不写入硬盘 而是写在内存只在当前页面有效删除cookie 使用setMaxAge 0 方法 向客户端发送Cookie 2 向客户端发送Cookie的例子 SendCookie java publicvoiddoGet HttpServletRequestrequest HttpServletResponseresponse throwsIOException ServletException CookieuserCookie newCookie username hacker userCookie setMaxAge 60 60 24 7 response addCookie userCookie response setContentType text html PrintWriterout response getWriter out println addcookies out println Acookiehasbeensenttobrowser out println 读取cookie调用request getCookies得到Cookie对象组成的数组Cookie cookies request getCookies 在这个数组中循环 调用getName 直到找到想要的cookie为止根据应用程序的具体情况使用这个值 getValue 从客户端读取Cookie 获取cookie的例子 GetCookie java publicclassGetCookieServletextendsHttpServlet publicvoiddoGet HttpServletRequestrequest HttpServletResponseresponse throwsIOException ServletException StringcookieName username StringcookieValue null Cookie cookies request getCookies if cookies null for inti 0 igetcookies out println Acookiehasbeengotfrombrowser out println CookieName cookieName out println CookieValue cookieValue out println 例 使用cookie检测初访者 1 importjava io IOException importjava io PrintWriter importjavax servlet ServletException importjavax servlet http publicclassRepeatVisitorextendsHttpServlet protectedvoiddoGet HttpServletRequestrequest HttpServletResponseresponse throwsServletException IOException booleannewbie true Cookie cookies request getCookies if cookies null for inti 0 i cookies length i Cookiec cookies i if c getName equals repeatVisitor 例 使用cookie检测初访者 2 Stringtitle if newbie CookiereturnVisitorCookie newCookie repeatVisitor yes returnVisitorCookie setMaxAge 60 60 24 365 response addCookie returnVisitorCookie title WelcomeAboard else title WelcomeBack response setContentType text html PrintWriterout response getWriter out println repeatVisitor out println title 例 使用cookie检测初访者的页面效果 43 使用cookie的属性getDomain setDomain允许我们指定cookie适用的域当前的主机必须是所指定的域的一部分getMaxAge setMaxAge读取 设置cookie的到期时间 秒 若不设置 则cookie只适用于当前的浏览会话getName读取cookie的名称不存在setName方法 4 2 4cookie属性设置 1 44 使用cookie的属性getPath setPath读取 设置cookie适用的路径如果未指定 则cookie适用于含有当前页面的目录中的URL 以及该目录之下的URLgetValue setValue读取 设置与cookie关联的值如果设置了某个输入cookie的值 我们依旧需要用response addCookie将它发送回去 4 2 4cookie属性设置 2 45 例子 区分会话cookie和持续性cookie 1 publicclassCookieTestextendsHttpServlet publicvoiddoGet HttpServletRequestrequest HttpServletResponseresponse throwsServletException IOException for inti 0 i 3 i Cookiecookie newCookie Session Cookie i Cookie Value S i NomaxAge iemaxAge 1 response addCookie cookie cookie newCookie Persistent Cookie i Cookie Value P i cookie setMaxAge 3600 response addCookie cookie 46 例子 区分会话cookie和持续性cookie 2 StartanHTMLtableCookie cookies request getCookies if cookies null out println Nocookies else Cookiecookie for inti 0 i n cookie getName n cookie getValue n 47 首次访问CookieTestservlet的结果访问该servlet 退出浏览器 等待一小时后再次访问这个servlet 得到相同的结果 例子 区分会话cookie和持续性cookie 3 48 首次访问后一小时之内再次访问使用同一浏览器会话 浏览器保持打开 例子 区分会话cookie和持续性cookie 4 49 首次访问后一小时之内再次访问使用不同浏览器会话 例子 区分会话cookie和持续性cookie 5 50 例 利用cookie记录用户的访问计数 publicclassClientAccessCountsextendsHttpServlet publicvoiddoGet HttpServletRequestrequest HttpServletResponseresponse throwsServletException IOException StringcountString CookieUtilities getCookieValue request accessCount 1 intcount 1 try count Integer parseInt countString catch NumberFormatExceptionnfe 51 例 利用cookie记录用户的访问计数 2 LongLivedCookiec newLongLivedCookie accessCount String valueOf count 1 response addCookie c response setContentType text html PrintWriterout response getWriter out println docType n title n n n title n Thisisvisitnumber count bythisbrowser n 52 例 查找指定名称的cookie importjavax servlet importjavax servlet http publicclassCookieUtilities publicstaticStringgetCookieValue HttpServletRequestrequest StringcookieName StringdefaultValue Cookie cookies request getCookies if cookies null for inti 0 i cookies length i Cookiecookie cookies i if cookieName equals cookie getName return cookie getValue return defaultValue 53 例 创建长生存期的cookie importjavax servlet http publicclassLongLivedCookieextendsCookie publicstaticfinalintSECONDS PER YEAR 60 60 24 365 publicLongLivedCookie Stringname Stringvalue super name value setMaxAge SECONDS PER YEAR 54 例 利用cookie记录用户的访问计数页面效果 客户可能认为Cookie会带来安全问题 因此禁用Cookie 事实上 Cookie并不会造成严重的安全威胁 Cookie永远不会以任何方式执行 因此也不会带来病毒或攻击你的系统 另外 由于浏览器一般只允许存放300个Cookie 每个站点的Cookie最多存放20个 每个Cookie的大小限制为4KB 因此Cookie不会塞满你的硬盘 更不会被用作 拒绝服务 攻击手段 4 2 4Cookie的安全问题 例 通过Cookie实现自动登录CheckUserServlet java 57 cookie的隐私问题处理尽可能不依赖cookie避免用cookie存储敏感信息cookie的删除 Cookie的隐私问题处理 58 进行会话跟踪 URL重写当客户端关闭cookie支持时 可以使用URL重写来支持会话跟踪会话标识符附在URL上作为响应传给客户端如 http host path file html jsessionid 1234原 catalogURL重写 catalog 4 3URL重写与隐藏表单域 59 必须对相应的URL进行编码HttpServletResponse接口提供了两个方法 如下所示 1 publicStringencodeURL Stringurl 该方法返回带会话ID的URL 它主要用于Servlet发出的一般的URL out

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论