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对象状态

  • 相关阅读:
    Sliverlight之 矢量绘图
    Silverlight之 xaml布局
    七天学会ASP.NET MVC(七)——创建单页应用
    MVC视图之间调用方法总结
    C#取得程序的根目录以及判断文件是否存在
    七天学会ASP.NET MVC (六)——线程问题、异常处理、自定义URL
    [C#] .NET4.0中使用4.5中的 async/await 功能实现异步
    C#中StreamReader读取中文文本出现乱码的解决方法
    七天学会ASP.NET MVC (五)——Layout页面使用和用户角色管理
    常用正则表达式
  • 原文地址:https://www.cnblogs.com/Vivian-zhuan/p/4679549.html
Copyright © 2011-2022 走看看