1.定义:session在Web开发环境下,它的含义是指一类用来在客户端与服务器端之间保持状态的解决方案。有时候Session也用来指这种解决方案的存储结构。
2.session机制
1)session机制采用的是在服务器端保持 HTTP 状态信息的方案
2)服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息
3)当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否包含了一个session标识(即sessionId)。
如果已经包含一个sessionId则说明以前已经为此客户创建过session,服务器就按照session id把这个session检索出来使用(如果检索不到,可能会新建一个,这种情况可能出现在服务端已经删除了该用户对应的session对象,但用户人为地在请求的URL后面附加上一个JSESSION的参数)。
如果客户请求不包含sessionId,则为此客户创建一个session并且生成一个与此session相关联的sessionId,这个session id将在本次响应中返回给客户端保存。
3.保存session id的几种方式
1)保存session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器。
2)由于cookie可以被人为的禁用,必须有其它的机制以便在cookie被禁用时仍然能够把session id传递回服务器,经常采用的一种技术叫做URL重写,就是把session id附加在URL路径的后面,附加的方式也有两种:
一种是作为URL路径的附加信息;
一种是作为查询字符串附加在URL后面;
网络在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个session id;
4.Session cookie
1)session通过SessionID来区分不同的客户, session是以cookie或URL重写为基础的。默认使用cookie来实现,系统会创造一个名为JSESSIONID的输出cookie,这称之为session cookie,以区别persistent cookies(也就是我们通常所说的cookie),session cookie是存储于浏览器内存中的,并不是写到硬盘上的,通常看不到JSESSIONID,但是当把浏览器的cookie禁止后,web服务器会采用URL重写的方式传递;
2)session cookie针对某一次会话而言,会话结束session cookie也就随着消失了,而persistent cookie只是存在于客户端硬盘上的一段文本;
3)关闭浏览器,只会是浏览器端内存里的session cookie消失,但不会使保存在服务器端的session对象消失,同样也不会使已经保存到硬盘上的持久化cookie消失。
5.HttpSession 的声明周期
1).什么时候创建 HttpSession 对象
① 对于JSP:是否浏览器访问服务器端的任何一个JSP, 服务器都会立即创建一个 HttpSession 对象呢?不一定。
> 若当前的 JSP 是客户端访问的当前 WEB 应用的第一个资源,且 JSP 的 page 指定的 session 属性值为 false,
则服务器就不会为 JSP 创建一个 HttpSession 对象;
> 若当前 JSP 不是客户端访问的当前 WEB 应用的第一个资源,且其他页面已经创建一个 HttpSession 对象,
则服务器也不会为当前的JSP 页面创建一个HttpSession 对象,而会把和当前会话相关联的那个HttpSession 对象返回给当前的JSP 页面;
② 对于Servlet:若Servlet 是客户端访问的第一个WEB 应用的资源,
则只有调用了request.getSession() 或者 request.getSession(true) 才会创建 HttpSession 对象
2).page指令中的 session=“false“ 到底表示什么意思?
> 当前 JSP 页面禁用 session 隐含变量!但可以使用其他的显式的 HttpSession 对象
如:HttpServlet session = request.getSession(false);
3).在Servlet 中如何获取HttpSession 对象?
> request.getSession(boolean create):
若参数为 false, 则 若没有和当前JSP 页面关联的HttpSession 对象,则返回 null , 若有 则返回 关联的 HttpSession 对象
若参数为 true, 一定返回一个HttpSession 对象,若没有和当前JSP 页面关联的HttpSession 对象,则服务器创建一个新的HttpSession 对象,若有,直接返回关联的HttpSession对象
> request.getSession():等同于 request.getSession(true)
4).什么时候销毁HttpSession 对象
① 直接调用HttpSession 的invalidate() 方法,使当前的HttpSession 对象失效。即,以后每次刷新页面就会重新创建一个HttpSessioin 对象
② 服务器卸载了当前的 WEB 应用
③ 超出HttpSession 的过期时间: 以秒为单位
>session.setMaxInactiveInterval(interval) //设置 session 过期的时间 ,默认是 30分钟
>session.getMaxInactiveInterval(); //获取 sesson 过期时间
> 在web.xml 文件中设置HttpSession 的过期时间 : 单位为分钟。在$TOMECAT_HOME/web.xml
<session-config>
<session-timeout>30</session-timeout>
</session-config>
④ 并不是关闭了浏览器就销毁了HttpSession:url重写,持久化cookie
5).利用URL重写实现Session跟踪
① Servlet规范中引入了一种补充的会话管理机制,它允许不支持Cookie的浏览器也可以与WEB服务器保持连续的会话。
这种补充机制要求在响应消息的实体内容中必须包含下一次请求的超链接,并将会话标识号作为超链接的URL地址的一个特殊参数
② 将会话标识号以参数形式附加在超链接的URL地址后面的技术称为URL重写。
如果在浏览器不支持Cookie或者关闭了Cookie功能的情况下,WEB服务器还要能够与浏览器实现有状态的会话,就必须对所有可能被客户端访问的请求路径(包括超链接、form表单的action属性设置和重定向的URL)进行URL重写
HttpServletResponse接口中定义了两个用于完成URL重写方法: encodeURL方法 encodeRedirectURL方法
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>session login JSP</title> 8 </head> 9 <body>10 11 SessionId :<%= session.getId() %>12 <br><br>13 14 IsNew:<%= session.isNew() %>15 <br><br>16 17 MaxInactiveInterval:<%= session.getMaxInactiveInterval() %>18 <br><br>19 20 CreateTime:<%= session.getCreationTime() %>21 <br><br>22 23 LastAccessTime:<%= session.getLastAccessedTime() %>24 <br><br>25 <%26 Object username = session.getAttribute("username");27 if(username == null){28 username = "";29 }
30 %>31 32 <form action="<% response.encodeURL("login.jsp") %>" method="post">33 34 username:<input type="text" name="username" value="<%= username %>"/>35 <input type="submit" value="submit"/>36 </form>37 38 </body>39 </html>
6.Session的创建与删除
1)一个常见的错误是以为session在有客户端访问时就被创建,然而事实是直到某server端程序(如Servlet)调用HttpServletRequest.getSession(true) 或者 HttpServletRequest.getSession()这样的语句时才会被创建
2)session在下列情况下被删除:
① 程序调用HttpSession.invalidate()
② 距离上一次收到客户端发送的session id时间间隔超过了session的最大有效时间
③ 服务器进程被停止
3)关闭浏览器只会使存储在客户端浏览器内存中的session cookie失效,不会使服务器端的session对象失效