Session
web应用程序基于HTTP协议
HTTP基于请求/响应模式
-所有请求都是相互独立的,无连续性的
HTTP是无连接的协议
-限制每次连接只处理一个请求
HTTP是无状态的协议
-协议对于事务处理没有记忆能力
会话管理概念
会话是一个客户端连续不断地和服务器端进行请求/响应的一系列交互
多次请求间建立关联的方式称为会话管理,或者会话跟踪
-会话状态,指服务器与浏览器在会话过程中产生的状态信息
会话的实现过程
-当服务器接收到客户端的首次请求时,服务器初始化一个会话并分配给该会话一个唯一的标识符
-在以后的请求中,客户端必须将唯一标识符包含在请求中,服务器根据此标识符将请求与对应的会话联系起来
会话管理:使用cookie
所有的HTTP消息,不管是请求还是响应均包含头信息
-当服务器返回响应给客户端时,Servlet容器把会话的信息添加到响应头信息中
-客户端浏览器接收到响应后提取头信息,并将其存储在本地机中,以后发送请求时会自动将该信息带回服务器端
-浏览器存储在客户端机器上的头信息称作Cookie,它以“属性名=属性值; …”方式组成文本信息
创建并向客户端发送cookie
创建Cookie对象
-调用Cookie的构造方法,给出Cookie的名称和Cookie的值,二者都是字符串
Cookie c = new Cookie(“userName”,”a1234”)
设置最大时效
-如果要告诉浏览器将Cookie存储到磁盘上,而非仅保存在内存中,使用setMaxAge方法(参数为秒数)
c.setMaxAge(606024*7)//一周(正数)
将Cookie放入到HTTP响应中
-使用response.addCookie©
-如没有这一步,将不会有任何Cookie被发送到浏览器
从客户端读取cookie
调用request.getCookies
-得到Cookie对象组成的数组
-循环数组,调用每个对象的getName找到想要的cookie
-根据应用程序调用getValue方法使用这个Cookie
cookie的方法
getMaxAge()tMaxAge()
-读取/设置Cookie到期时间(秒)
如果值为0,表示删除对应的Cookie
如果值为负数,表示Cookie只适用于当前的浏览会话
默认值为-1
getName()
-读取Cookie的名称。不存在setName方法
getValue()tValue()
-读取/设置与Cookie关联的值
如果重新设置了某Cookie的值,需要用addCookie()方法将其发送回去
cookie的优缺点
优点:
-可配置到期规则,数据可持久保存
-不需要服务器资源,数据保存在客户端
-简单性,基于文本的Key-Value对
缺点:
-大小受到限制(总数300;20/站点;4KB/Cookie)
-用户可禁用客户端接收Cookie的功能
-潜在的安全风险
会话管理:使用隐藏的表单域
思想:
通过使用隐藏域,由浏览器主动告知服务器多次请求间必要的信息,如在线问卷作答
优点:
Cookie被禁用或者根本不支持的情况下依旧能够工作
缺点:
关掉网页后会遗失先前的请求信息
所有的页面必须是表单提交之后的结果
会话管理:使用url重写
思想
-当服务器响应浏览器上一次请求时,将某些相关信息以超链接方式响应给浏览器,超链接中包括请求参数信息
-由于GET方式发送请求,通常URL重写用于简单客户端信息保留,或辅助Session会话管理
session
在Servlet中进行会话管理,可以使用HttpServletRequest的getSession()方法取得HttpSession对象(简称为Session),通过设置/获取服务器端Session对象的属性,来保留请求之间的相关信息
1.//获取HttpSession对象,设置相关属性
HttpSession session = req.getSession();
session.setAttribute(“userName”, userName);
2.//获取HttpSession对象,取出相关属性
HttpSession session = req.getSession();
session.getAttribute("username”);
Servlet容器提供Session接口来代表服务器端和客户端的会话
-当一个WEB服务器为客户端开始一个会话时,创建一个新的Session对象(含有特殊ID,称为Session ID,默认用Cookie存放在浏览器中。在Tomcat中,Cookie的名称为JSESSIONID)
-Session将数据存储在服务器的内存中,供以后来自同一个客户端的请求使用
使用session对象
通常分三个步骤
-获取一个与请求相关联的会话
HttpSession session = request.getSession();
-从Session中设置或获取一个属性
session.setAttribute(“userName”,userName);
session.getAttribute(“username”);
-根据需要关闭会话
session.invalidate();
通常客户端不提供结束会话的通知,而是Servlet容器在用户处于一段非活动期后就会自动的使会话失效——这个时间段称为会话的超时期
会话失效
Session对象失效:当用户超出指定会话期时间处于非活动状态时,会话自动结束
-setMaxInactiveInterval(),设置会话的超时期
-通过web.xml的标签设置
-使用方法invalidate()
Cookie失效
-默认关闭浏览器Cookie消失
-在web.xml中设定存储Session ID的Cookie存活期限
Session与URL重写
当用户浏览器禁用Cookie时,仍打算运用Session来进行会话管理,可以对所有的URL使用URL重写
-可以使用HttpServletResponse的encodeURL()方法在URL后附加Session ID
Session的方法
getAttribute()
从会话对象中提取出一个之前存储的属性值
如果没有找到与名称相关联的值,则返回null
setAttribute()
设置会话对象的属性名称和属性值
removeAttribute()
移除与名称关联的值
getAttributeNames()
返回会话中所有属性的名称
getId()
返回唯一的标识符
isNew()
确定会话对于客户来说是否为新创建
getCreationTime()
返回会话创建的时间
getLastAccessedTime()
返回客户端最近一次发送请求的时间
getMaxInactiveInterval()、setMaxInactiveInterval()
取得或设置会话的超时期
invalidate()
废弃当前的会话