会话和会话状态
会话是一个客户端浏览器与WEB服务器之间连续发生的一系列请求和响应过程。
会话状态是指WEB服务器与浏览器在会话过程中的状态信息,借助会话状态,WEB服务器能够把属于同一会话中的一系列的请求过程关联起来。WEB服务器端程序要能从大量的请求消息中区分哪些请求消息属于同一个会话,即能识别出来同一个浏览器的访问请求,者需要浏览器对其发出的每个请求消息都进行标识;属于同一会话中的请求消息都附带同样的标识号,而属于不同会话的请求消息总是附带不同的标识号,这个标识号就称为会话ID(SessionID
)。
HTTP协议是一种无状态的协议,WEB服务器本身不能识别出哪些请求时一种浏览器发出的,浏览器的每一次请求都是完全孤立的。所以Web服务器,必须能够采用一种机制来唯一地标识一个用户,同时记录该用户的状态。Web服务器通常通过两种方式完成会话跟踪:
Cookie
Cookie
机制在浏览器中直接保存会话信息。服务器响应客户端时,在响应头部里带有set-cookie
字段将会话信息发送给浏览器,客户端在后面的请求都将在头部中添加cookie
字段,将会话信息放入其中。Cookie
的作用范围默认可以作用当前目录和当前目录的子目录,但不能作用与当前目录的上一级。可以手动制定Cookie
的作用范围。Cookie
分为会话Cookie
(Session Cookie
)和持久化Cookie
(Persistent Cookie
):会话Cookie
只存在于浏览器的内存中,浏览器关闭后Cookie
将不进行保存;持久化Cookie
保存在硬盘上,在浏览器关闭后Cookie
仍然存在,下次访问能继续使用。Session
Session
机制基于Cookie
实现,采用的是在服务器端保持HTTP状态信息的方案。服务器采用一种类似与散列表的结构来保存Session
上的数据,并通过Cookie
将散列表的哈希值交由客户端保存。客户端在会话过程中,只需保存和发送哈希值。Session
机制:当程序需要为某个客户端的请求创建一个Session
时,服务器首先检查这个客户端的Session
标识(即SessionID
),如果已经包含一个SessionID
,则说明以前已经为此客户创建过Session
,服务器就按照这个SessionID
将Session
检索出来(如果检索不到,就可能会创建一个,这种情况可能出现在服务端已经删除了该用户对应的Session
对象,但用户可以人为的在URL后面加上一个JSESSIOIN
的参数)。如果客户请求不包含SessionID
则为此客户创建一个Session
并且生产一个与此Session
关联的SessionID
,这个SessionID
在本次响应中返回给客户端保存。若浏览器禁用了Cookie
,浏览器可以通过URL重写的方式传递Session
。保存sessionid:
使用cookie,在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器
浏览器保存
SessionID
一般是采用会话Cookie
的方式。但如果手动的写入一个JSESSIONID
的Cookie
,将保存在持久化Cookie
中。使用URL重写,把
SessionID
放在URL路径后面。在整个交互过程中,需要重写每一次的URL。附加的方式有两种- 作为URL路径的附加信息
- 作为查询字符串
JavaWeb中的Cookie
创建Cookie对象
Cookie cookie = new Cookie("name","value");
获取Cookie的值和名称
cookie.getName(); cookie.getValue();
调用response的一个方法把Cookie传给客户端
response.addCookie(cookie);
获取所有Cookie
Cookie[] cookies = request.getCookies();
设置
Cookie
过期时间//以秒为单位。 //若为0,则立即删除该cookie; //若为负数,表示不存储该cookie(会话Cookie) //若为正数,则表示该cookie的存储时间(持久化Cookie) cookie.setMaxAge(30);
设置
Cookie
作用范围cookie.setPath(path);
JavaWeb中的Session
JSP中获取Session
对象
JSP
页面中有个内置的session
对象,可以直接使用。若当前的JSP
页面或Servlet
是客户端访问的当前WEB应用的第一个资源,且JSP
的page指定的session属性值不为false,则服务器就会为创建一个HttpSession
对象。若当前JSP
页面不是客户端访问的当前web应用的第一个资源,且其他页面已经创建过Session
对象,则当前JSP
页面的session
为前面回话的HttpSession
对象。
Servlet中获取Session
对象
Servlet
中可以通过调用request
对象的getSession
对象来获取Session
对象。
// create为false:有与当前jsp对象关联的httpsession对象,则返回该对象;若没有和当前JSP对象关联的httpsession对象,则返回null
// create为true:一定返回一个HttpSession对象,若有与当前jsp对象关联的httpsession对象,则返回该对象;若没有,则创建一个httpsession对象,并返回该对象
request.getSession(boolean create);
销毁Session
对象
销毁Session
对象可以通过三种方式:
调用
Session
对象的invalidate
方法session.invalidate();
服务器卸载当前Web应用
超出
Session
过期时间(默认30分钟)通过
session
对象设置过期时间session.setMaxInactiveInterval(5);//单位为秒
在
web.xml
中设置过期时间tomcat下config/web.xml <!--在web.xml中设置过期时间--> <!--在web.xml中设置过期时间--> <session-config> <session-timeout>5</session-timeout> </session-config>
并不是关闭浏览器就销毁
HttpSession
对象。例如通过持久化Cookie
或者URL重写
Session对象常用方法
方法 | 描述 |
---|---|
getId() | 获取SessionID 值 |
setAttribute() | 设置属性 |
getAttribute() | 获取属性 |
removeAttribute() | 移除属性 |
getAllAttributeNames() | 获取所有的属性名 |
getMaxInactiveInterval() | 获取最长到期时间 |
setMaxInactiveInterval() | 设置最长到期事件 |
invalidate() | 使该Session 对象失效 |
getCreationTime() | 获取创建时间 |
getLastAccessedTime() | 获取上次访问时间 |
URL重写
URL重写是一种补充的会话管理机制,当浏览器不支持Cookie
时,可以将会话标识作为URL地址的一个特殊参数,从而继续实现会话管理。
HttpServletResponse
接口中定义了两个用于完成URL重写的方法:
response.encodeURL("url");
response.encodeRedirectURL("url")