zoukankan      html  css  js  c++  java
  • Java会话(session)管理

    会话概述

    什么是会话

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

    需要解决的问题

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

    两种技术

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

      Cookie类

      1、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的path设置成了/app/,说明访问/app/下面的任何资源,都会带cookie过去。

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

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

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

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

    • version:可选,Cookie的版本

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

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

    4、如何唯一确定一个Cookie(有同名Cookie情况)
    通过domain+path+name,可以确定唯一一个Cookie

    5、其他

    • 一个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技术

    1、获得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对象。

    2、HttpSession本身是一个域对象

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

    3、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超时或被销毁。

    4、HttpSession对象的状态转换

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

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

    4.2 HttpSession对象状态

  • 相关阅读:
    C/C++多文件之间的变量定义
    PKU POJ 2186 Popular Cows 强连通分量
    重载函数
    ZOJ 2763 Prison Break
    201357 训练赛总结
    hdu 4467 Graph 构造
    201356 训练赛总结
    201353 NEERC 2012, Eastern subregional contest
    2013512 CF 183 总结
    一道动态规划
  • 原文地址:https://www.cnblogs.com/likeju/p/4681841.html
Copyright © 2011-2022 走看看