会话的概述

什么是会话

简单的理解:用户打开浏览器,点击多个超连接,访问Web服务器上多个资源,而后关闭浏览器,整个过程称之为一次会话。java

须要解决的问题

每一个用户在使用浏览器与服务器会话的过程当中,会产生一些用户数据,如用户登录标记,WEB应用程序必需要为每一个用户在一次或屡次会话过程当中保存这些数据。web

两种技术

  • Cookie
    Cookie是客户端技术,WEB应用程序把每一个用户数据以Cookie的形式发送给各自的的浏览器,当用户使用浏览器再次访问WEB应用时,就会带上这些Cookie,这样,WEB应用能够为每一个用户分别处理各自的数据了。
  • HttpSession
    简称Session,是服务器端技术,服务器在运行时为每一个用户的浏览器建立一个其独享的HttpSession对象。因为用户各自独享session,因此能够把各自的数据存放在各自的session域中,当用户去访问当前web应用其余web资源时,其余web资源再从用户各自的session中取出数据为其服务。数组

    Cookie类

    一、javax.servlet.http.Cookie
    Cookie的属性:浏览器

  • name:必须的,Cookie名缓存

  • value:必须的,Cookie名对应的数据
  • comment:可选,备注
  • path:默认值就是产生Cookie的Servlet对应的URI

有一个cookie它的路径是:/app/servlet/
当浏览器访问的新资源的路径是:/app/1.jsp
问?浏览器会将该cookie带给1.jsp吗?不会服务器

当浏览器访问的新资源的路径是:/app/servlet/a/b/ServletDemo1
问?浏览器会将该cookie带给ServletDemo1吗?

总结:在访问一个资源时,带不带已有的cookie。访问的资源路径.startsWith(cookie的path),若是为true,则会带cookie

若是把一个Cookie的path设置成了/app/,说明访问/app/下面的任何资源,都会带cookie过去。session

  • domain:默认就是产生Cookie的Servlet所在的网站域名并发

    加入cookie的domain是www.baidu.com
    访问http://www.163.com带不带?不带app

  • maxAge:标识cookie的生命周期。默认是一次会话

要想在客户端的缓存中保存住Cookie的数据,增大它的存活时间。单位是秒
若是取值为0,就是要删除之。

  • version:可选,Cookie的版本

二、服务器向客户端写Cookie
response.addCookie(Cookie cookie);对应设置响应头的“Set-Cookie”

三、获取客户端提交过来的Cookie
Cookie[] cookies = request.getCookies();接着遍历cookies数组肯定所需的Cookie

四、如何惟一肯定一个Cookie(有同名Cookie状况)
经过domain+path+name,能够肯定惟一一个Cookie

五、其余

  • 一个WEB站点能够给一个WEB浏览器发送多个Cookie,一个WEB浏览器能够存储多个WEB站点提供的Cookie
  • 浏览器通常只容许存放300个cookies,每一个站点最多存放20个Cookie,每一个Cookie的大小限制为4KB
  • 若是建立一个Cookie,并发送到浏览器,默认状况是一个会话级别的cookie,即只存在浏览器的内存中。若须要存储在磁盘上则须要设置maxAge属性为大于0的数值,单位为秒。为0则是告诉浏览器删除该cookie。
  • 删除cookie时,path必须一致,不然删除不成功

HttpSession类

javax.servlet.http.HttpSession HttpSession技术实际上仍是利用Cookie技术

一、得到HttpSession对象:

HttpSession session = request.getSession();

每个HttpSession对象都有一个惟一的ID
为了标识每个客户端,实际上向客户端写了一个特殊的Cookie:

  • 该Cookie的name为固定的“JSESSIONID”
  • 该Cookie的value为HttpSession对象的id
  • 该Cookie的path为当前应用路径

request.getSession()方法详解:

  • 若是用户带着一个名称叫作JSESSIONID的Cookie过来了,先按照ID到服务器内存中找对应的HttpSession对象,
  • 没找到或者浏览器没有带,则建立一个新的HttpSession对象,亦即有了新的ID,同时写给客户端JSESSION=sessionid;
  • 若是找到了,返回该HttpSession对象,继续为用户服务。

request.getSession(boolean b):若是b为true,做用等同于request.getSession()。 若是b为false,做用只是获取。找不到则返回null。

session.invalidate():马上摧毁服务器中的HttpSession对象。

二、HttpSession自己是一个域对象

void setAttribute(String name,Object obj) 设置属性
void removeAttribute(String name) 移除属性
Object getAttribute(String name) 获取属性

三、HttpSession生命周期

3.1 客户端向服务器第一次发送请求的时候,request中并没有sessionID.
3.2 此时server端会建立一个session对象,并分配一个sessionID,serssion对象会保存在服务器端。此时session的状态处于new state状态,若是调用session.isNew(),则返回true
3.3 当服务器段处理完毕后,将此sessionID,以Cookie的形式传到客户段。
3.4 当客户段再次发送请求时,会将sessionID 同request参数一块儿发送,传递给服务器端。
3.5 服务器端能够根据传递过来的sessionID将此次请求(request)与保存在服务器端的session对象联系起来,此时的session已不处于new state状态,若是调用session.isNew(),则返回false.
3.6 循环3-5 ,直到session超时或被销毁。

四、HttpSession对象的状态转换

HttpSession对象默认超时为30分钟。
4.1 更改HttpSession的默认超时时间:
在web.xml中配置

1
2
3
<session-config>
  <session-timeout>1</session-timeout><!--单位为1分钟-->
</session-config>

 

其余

IE什么时候开启一次新的会话

一、IE7-(含):开启一次新的浏览器进程就是一次新的会话。 二、IE8+(含):开启一次新的浏览器进程与原开启的进程属于同一次会话。(“文件”/”新建会话”) 三、开启了一个页面,再开启一个新的Tab页.也是同一次会话 四、开启了一个页面,在此页面上链接到了另一个页面(在新窗口打开的).也是同一次会话

相关文章
相关标签/搜索