-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------html
1.定义:session在Web开发环境下,它的含义是指一类用来在客户端与服务器端之间保持状态的解决方案。有时候Session也用来指这种解决方案的存储结构。java
2.session机制web
1)session机制采用的是在服务器端保持 HTTP 状态信息的方案 浏览器
2)服务器使用一种相似于散列表的结构(也可能就是使用散列表)来保存信息服务器
3)当程序须要为某个客户端的请求建立一个session时,服务器首先检查这个客户端的请求里是否包含了一个session标识(即sessionId)。cookie
若是已经包含一个sessionId则说明之前已经为此客户建立过session,服务器就按照session id把这个session检索出来使用(若是检索不到,可能会新建一个,这种状况可能出如今服务端已经删除了该用户对应的session对象,但用户人为地在请求的URL后面附加上一个JSESSION的参数)。网络
若是客户请求不包含sessionId,则为此客户建立一个session而且生成一个与此session相关联的sessionId,这个session id将在本次响应中返回给客户端保存。session
3.保存session id的几种方式jsp
1)保存session id的方式能够采用cookie,这样在交互过程当中浏览器能够自动的按照规则把这个标识发送给服务器。post
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对象失效