当用户通过浏览器访问Web应用时,通常情况下,服务器需要对用户的状态进行跟踪。例如,用户在网站结算商品时,Web服务器必须根据请求用户的身份,找到该用户所购买的商品。在Web开发中,服务器跟踪用户信息的技术称为会话技术。

一、会话概述

在日常生活中,从拨通电话到挂断电话之间的一连串的你问我答的过程就是一个会话。Web应用中的会话过程类似于生活中的打电话过程,它指的是一个客户端(浏览器)与Web服务器之间连续发生的一系列请求和响应过程,例如,一个用户在某网站上的整个购物过程就是一个会话。
        在打电话过程中,通话双方会有通话内容,同样,在客户端与服务器端交互的过程中,也会产生一些数据。例如,用户甲和乙分别登录了购物网站,甲购买了一个Nokia手机,乙购买了一个Ipad,当这两个用户结账时,Web服务器需要对用户甲和乙的信息分别进行保存。在前面章节讲解的对象中,HttpServletRequest对象和ServletContext对象都可以对数据进行保存,但是这两个对象都不可行,具体原因如下:

(1)客户端请求Web服务器时,针对每次HTTP请求,Web服务器都会创建一个HttpServletRequest对象,该对象只能保存本次请求所传递的数据。由于购买和结账是两个不同的请求,因此,在发送结账请求时,之前购买请求中的数据将会丢失。
(2)使用ServletContext对象保存数据时,由于同一个Web应用共享的是同一个ServletContext对象,因此,当用户在发送结账请求时,由于无法区分哪些商品是哪个用户所购买的,而会将该购物网站中所有用户购买的商品进行结算,这显然也是不可行的。
(3)为了保存会话过程中产生的数据,在Servlet技术中,提供了两个用于保存会话数据的对象,分别是Cookie和Session。

二、Cookie对象

1.介绍Cookie

Cookie是一种会话技术,它用于将会话过程中的数据保存到用户的浏览器中,从而使浏览器和服务器可以更好地进行数据交互。
在现实生活中,当顾客在购物时,商城经常会赠送顾客一张会员卡,卡上记录用户的个人信息(姓名,手机号等)、消费额度和积分额度等。顾客一旦接受了会员卡,以后每次光临该商场时,都可以使用这张会员卡,商场也将根据会员卡上的消费记录计算会员的优惠额度和累加积分。在Web应用中,Cookie的功能类似于这张会员卡,当用户通过浏览器访问Web服务器时,服务器会给客户端发送一些信息,这些信息都保存在Cookie中。这样,当该浏览器再次访问服务器时,都会在请求头中将Cookie发送给服务器,方便服务器对浏览器做出正确的响应。

服务器向客户端发送Cookie时,会在HTTP响应头字段中增加Set-Cookie响应头字段。Set-Cookie头字段中设置的Cookie遵循一定的语法格式,具体示例如下:

在上述示例中,user表示Cookie的名称,itcast表示Cookie的值,Path表示Cookie的属性。需要注意的是,Cookie必须以键值对的形式存在,其属性可以有多个,但这些属性之间必须用分号;和空格分隔。

Cookie在浏览器和服务器之间的传输过程如图所示:

在图中,描述了Cookie在浏览器和服务器之间的传输过程。当用户第一次访问服务器时,服务器会在响应消息中增加Set-Cookie头字段,将用户信息以Cookie的形式发送给浏览器。一旦用户浏览器接受了服务器发送的Cookie信息,就会将它保存在浏览器的缓冲区中,这样,当浏览器后续访问该服务器时,都会在请求消息中将用户信息以Cookie的形式发送给Web服务器,从而使服务器端分辨出当前请求是由哪个用户发出的。

2.Cookie API

为了封装Cookie信息,在Servlet API中提供了一个javax.servlet.http.Cookie类,该类包含了生成Cookie信息和提取Cookie信息各个属性的方法。Cookie的构造方法和常用方法具体如下:

a.构造方法

Cookie类有且仅有一个构造方法,具体语法格式如下:

在Cookie的构造方法中,参数name用于指定Cookie的名称,value用于指定Cookie的值。需要注意的是,Cookie一旦创建,它的名称就不能更改,Cookie的值可以为任何值,创建后允许被修改。

b.Cookie类的常用方法

通过Cookie的构造方法创建Cookie对象后,便可调用该类的所有方法,如下:

对表中比较难以理解的方法进行讲解

1)setMaxAge(int expiry)和getMaxAge()方法
上面的这两个方法用于设置和返回Cookie在浏览器上保持有效的秒数。如果设置的值为一个正整数时,浏览器会将Cookie信息保存在本地硬盘中。从当前时间开始,在没有超过指定的秒数之前,这个Cookie都保持有效,并且同一台计算机上运行的该浏览器都可以使用这个Cookie信息;如果设置值为负整数时,浏览器会将Cookie信息保存在的缓存中,当浏览器关闭时,Cookie信息会被删除。如果设置值为0时,则表示通知浏览器立即删除这个Cookie信息。默认情况下,Max-Age属性的值是-1。

2)setPath(String uri)和getPath()方法
上面的这两个方法是针对Cookie的Path属性的。如果创建的某个Cookie对象没有设置Path属性,那么该Cookie只对当前访问路径所属的目录及其子目录有效。如果想让某个Cookie项对站点的所有目录下的访问路径都有效,应调用Cookie对象的setPath()方法将其Path属性设置为“/”。

3)setDomain(String pattern)和getDomain()方法
上面的这两个方法是针对Cookie的domain属性的。domain属性是用来指定浏览器访问的域。例如,传智播客的域为“itcast.cn”。那么,当设置domain属性时,其值必须以“.”开头,如domain=.itcast.cn。默认情况下,domain属性的值为当前主机名,浏览器在访问当前主机下的资源时,都会将Cookie信息回送给服务器。需要注意的是,domain属性的值是不区分大小写的。

3.案例代码:显示用户上次访问时间https://blog.csdn.net/daqi1983/article/details/120262884

三、Session对象

Cookie技术可以将用户的信息保存在各自的浏览器中,并且可以在多次请求下实现数据的共享。但是,如果传递的信息比较多,使用Cookie技术显然会增大服务器端程序处理的难度。这时,可以使用Session实现,Session是一种将会话数据保存到服务器端的技术。

1.什么是Session

当人们去医院就诊时,就诊病人需要办理医院的就诊卡,该卡上只有卡号,而没有其它信息。但病人每次去该医院就诊时,只要出示就诊卡,医务人员便可根据卡号查询到病人的就诊信息。Session技术就好比医院发放给病人的就医卡和医院为每个病人保留病例档案的过程。当浏览器访问Web服务器时,Servlet容器就会创建一个Session对象和ID属性,其中,Session对象就相当于病历档案,ID就相当于就诊卡号。当客户端后续访问服务器时,只要将标识号传递给服务器,服务器就能判断出该请求是哪个客户端发送的,从而选择与之对应的Session对象为其服务。
        需要注意的是,由于客户端需要接收、记录和回送Session对象的ID,因此,通常情况下,Session是借助Cookie技术来传递ID属性的。

以网站购物为例,通过一张图来描述Session保存用户信息的原理,具体如图所示:

在图中,用户甲和乙都调用buyServlet将商品添加到购物车,调用payServlet进行商品结算。由于甲和乙购买商品的过程类似,在此,以用户甲为例进行详细说明。当用户甲访问购物网站时,服务器为甲创建了一个Session对象(相当于购物车)。当甲将Nokia手机添加到购物车时,Nokia手机的信息便存放到了Session对象中。同时,服务器将Session对象的ID属性以Cookie (Set-Cookie: JSESSIONID=111)的形式返回给甲的浏览器。当甲完成购物进行结账时,需要向服务器发送结账请求,这时,浏览器自动在请求消息头中将Cookie (Cookie: JSESSIONID=111)信息回送给服务器,服务器根据ID属性找到为用户甲所创建的Session对象,并将Session对象中所存放的Nokia手机信息取出进行结算。

2.HttpSession API

Session是与每个请求消息紧密相关的,为此,HttpServletRequest定义了用于获取Session对象的getSession()方法,该方法有两种重载形式,具体如下。

上面重载的两个方法都用于返回与当前请求相关的HttpSession对象。不同的是,第一个getSession()方法根据传递的参数来判断是否创建新的HttpSession对象,如果参数为true,则在相关的HttpSession对象不存在时创建并返回新的HttpSession对象,否则不创建新的HttpSession对象,而是返回null。

第二个getSession()方法则相当于第一个方法参数为true时的情况,在相关的HttpSession对象不存在时总是创建新的HttpSession对象。需要注意的是,由于getSession()方法可能会产生发送会话标识号的Cookie头字段,因此必须在发送任何响应内容之前调用getSession()方法。

HttpSession接口中定义的操作会话数据的常用方法如下表所示。

3.Session超时管理

当客户端第一次访问某个能开启会话功能的资源时,Web服务器就会创建一个与该客户端对应的HttpSession对象。在HTTP协议中,Web服务器无法判断当前的客户端浏览器是否还会继续访问,也无法检测客户端浏览器是否关闭,所以,即使客户端已经离开或关闭了浏览器,Web服务器还要保留与之对应的HttpSession对象。随着时间的推移,这些不再使用的HttpSession对象会在Web服务器中积累的越来越多,从而使Web服务器内存耗尽。

为了解决上面的问题,Web服务器采用了“超时限制”的办法来判断客户端是否还在继续访问。在一定时间内,如果某个客户端一直没有请求访问,那么,Web服务器就会认为该客户端已经结束请求,并且将与该客户端会话所对应的HttpSession对象变成垃圾对象,等待垃圾收集器将其从内存中彻底清除。反之,如果浏览器超时后,再次向服务器发出请求访问,那么,Web服务器则会创建一个新的HttpSession对象,并为其分配一个新的ID属性。

在会话过程中,会话的有效时间可以在web.xml文件中设置,其默认值由Servlet容器定义。在<Tomcat安装目录>\conf\web.xml文件中,可以找到如下一段配置信息:

<!-- ==================== Default Session Configuration ================= --><!-- You can set the default session timeout (in minutes) for all newly   --><!-- created sessions by modifying the value below.                       --><session-config><session-timeout>30</session-timeout></session-config>

在上面的配置信息中,设置的时间值是以分钟为单位的,即Tomcat服务器的默认会话超时间隔为30分钟。如果将<session-timeout>元素中的时间值设置成0或一个负数,则表示会话永不超时。由于<Tomcat安装目录>\conf\web.xml文件对站点内的所有Web应用程序都起作用,因此,如果想单独设置某个Web应用程序的会话超时间隔,则需要在自己应用的web.xml文件中进行设置。需要注意的是,要想使Session失效,除了可以等待会话时间超时外,还可以通过invalidate()方法强制使会话失效。

4.案例:实现购物车

5.利用URL重写跟踪Session(多学一招)

6.案例:实现用户登录

7.利用Session实现一次性验证码(多学一招)

五、会话及其会话技术相关推荐

  1. JavaWeb学习的第十五天(会话技术之Cookie_Session)

    一.会话技术的引入 1.问题:将验证码保存在servletcontext中会有问题,这是一个域对象,并且是一个全局变量,如果有两个人同时去获取验证码,第一个人还没有输入验证码,这个时候第二个人已经重新 ...

  2. java web 请求跟踪_IT兄弟连 JavaWeb教程 Servlet会话跟踪 Cookie技术

    原标题:IT兄弟连 JavaWeb教程 Servlet会话跟踪 Cookie技术 Cookie使用HTTPHeader传递数据.Cookie机制定义了两种报头,Set-Cookie报头和Cookie报 ...

  3. 会话及会话技术、Cookie对象、Session对象 详解

    会话及会话技术 当用户通过浏览器访问Web应用时,通常情况下,服务器需要对用户的状态进行跟踪.例如,用户在网站结算商品时,Web服务器必须根据 请求用户的身份,找到该用户所购买的商品.在Web开发中, ...

  4. 第5章 会话及其会话技术

    目录 5.1 会话概述 5.2 Cookie对象 5.2.1 什么是Cookie 5.2.2 Cookie API [任务5-1]显示用户上次访问时间 5.3 Session 对象 5.3.1 什么是 ...

  5. 动态网站开发讲课笔记05:会话及会话技术

    文章目录 零.本节学习目标 一.会话概述 (一)会话的概念 (二)全局数据共享 二.Cookie对象 (一)什么是Cookie 1.Cookie的概念 2.如何设置Cookie 2.Cookie操作示 ...

  6. IT职场人生系列之十五:语言与技术II

    本文是IT职场人生系列的第十五篇 本篇延续了技术与语言I的内容(之十二),搜集了之后大家的一些评论和我的反馈,整理在这里. "新人学老技术有风险"的实质 其实不是说老技术没有学习的 ...

  7. 开发者应该关注的五项Web新兴技术:WebGL和SVG名列其中

    最近一位HTML5专家Rich Clark(作者的好朋友)为大家做了一个HTML5 APIs的简介,在文章中为大家指向了一个令人迷惑的网页(web平台:浏览器技术http://platform.htm ...

  8. 计算机用户接入广域网的技术,第五章广域网接入技术全解.ppt

    第五章广域网接入技术全解 * * 第二章 广域网接入技术 本章学习要点: 广域网概述 数字数据网 DDN 综合业务数字网 ISDN 帧中继 FR 数字用户线路xDSL 公用分组交换网 PSDN 5.1 ...

  9. 5. 第五阶段 测试开发技术 - JAVA

    5. 第五阶段 测试开发技术 - JAVA 第一章 初识JAVA java简介 java语言的特性 搭建java环境 第一个java程序 public class Helloworld{public ...

  10. 第十五届 D2 前端技术论坛,我们云端相聚!

    第十五届 D2 前端技术论坛,如约而至. D2 前端技术论坛 (Designer & Developer Frontend Technology Forum, 简称 D2),是由阿里经济体前端 ...

最新文章

  1. 简历这样写,技术人都不直男了!
  2. pfx证书密码怎么查询_2019成考成绩查询时间通知!忘记账号和密码怎么办?
  3. html中文段落,HTML 段落-JavaScript中文网-JavaScript教程资源分享门户
  4. .NET中的异步编程 - 动机和单元测试
  5. C/C++ 存储类型 作用域 连接类型
  6. 【Git入门之二】基本术语
  7. Mybatis 数据库Mysql时间范围内数据查询非常慢的解决办法
  8. 管理感悟:人才是发现的,不是培养的
  9. Axure中推动拉动元件不生效_mac系统axure元件不能拖动的非正常解决方法
  10. 一次使用针式打印机打印异常问题的处理
  11. linux打包压缩命令
  12. 读取npy格式的文件
  13. Day11:股市风险
  14. 转:模拟信号隔离法则
  15. iOS 通过商品短链接跳转京东商品详情页
  16. java学习总结(16.07.16)Random类和BigDecimal类
  17. Ubuntu 下安装新世纪五笔输入法
  18. 宽带连不上网原因及解决办法
  19. 公众平台服务号、订阅号、企业微信以及小程序的相关说明
  20. Java基础入门(六)

热门文章

  1. 我的内核学习笔记3:我的platform驱动模板文件
  2. maven build后Downloading maven-metadata.xml
  3. java中redis存储map集合_使用RedisTemplate存储Map集合的一点注意
  4. 04-AIO通讯模型
  5. 【elasticsearch】ES 相似文章检测
  6. 1.1.0-简介-P4-一致性、2PC和3PC
  7. Spring : Spring 事务控制 设置手动回滚 TransactionAspectSupport
  8. 【FLink】FLink学习遇到的好文章
  9. Spark的StaticMemoryManager
  10. Tshark的使用问题