会话跟踪 ( 状态管理 )

HTTP协议是无状态的 , 我们的服务器在与客户端进行交互时, 没有记忆.

两种方式来实现状态管理:

    1.    Cookie技术:        将状态 , 存储到客户端中  
    2.    Session技术:        将id存储在客户端中,  将状态存储在服务器中.

Cookie技术

技术实现步骤以及原理:

    1.    当服务器向客户端响应时 , 可以向响应头部加入Cookie , 每一个Cookie表示一个键值对.
    2.    浏览器在接收到响应后, 如果存在Cookie , 则会将Cookie存储在文本文件中 (.txt)
        存储时, 会存储的信息有:    服务器的域 , 路径 , Cookie键 ,Cookie的值, 存储时长...
    3.    当浏览器向客户端请求时, 会遍历 Cookie的文本文件, 将匹配新请求地址的Cookie 携带上, 放在请求头部, 发送给服务器 !
        Cookie匹配的规则:    
            当cookie存储的域相同时,  路径匹配时 才会将Cookie发送给服务器.

如何创建Cookie

Cookie在Java中的体现 就是一个表示键值对的 Java类, 类名为: Cookie .

格式:
    Cookie cookie = new Cookie(String name,String value);


    Cookie cookie = new Cookie(String name,String value);
    cookie.setMaxAge(Integer.MAX_VALUE);
    cookie.setPath("/");
    response.addCookie(cookie);

如何将Cookie添加到响应头部

通过响应对象, 将Cookie添加到响应头部

格式:
    response.addCookie(Cookie cookie);

一次响应, 可以添加n个cookie  .
如果浏览器中已经存储过与某个Cookie的name相同的Cookie , 再次存储时会覆盖value

如何从请求头部 得到之前存储的所有Cookie

因为一个域 和 路径下, 可能存在多个Cookie  , 所以获取的不是单个Cookie , 而是一个数组:

Cookie[] cookies = request.getCookies();

//    如果从未存储过, 则返回的数组值是 null 

得到Cookie后, 如何取出其中的键和值.

获取Cookie的键:
    String name = cookie.getName();

获取Cookie的值:
    String value = cookie.getValue();

如何调整Cookie存储时长.

cookie.setMaxAge(int 秒);

    传入的值:
        -    负数        :    默认-1 , 表示浏览会话结束时 删除.
        -    正数        :    存活的秒数, 例如: 60*60*24*365*10 表示十年.
        -    0        :    经常用于覆盖一个cookie时使用, 作用为0秒后删除 (立即删除)

Cookie存储时, 路径问题的解决.

路径匹配的规则:

    -    Cookie的替换:    只能由相同域 , 相同路径的 完成替换.
    -    Cookie的获取:    只能由相同域 , 相同路径或子路经 获取

例如:
    A地址:        localhost/x/a.do
    B地址:        localhost/x/b.do
    C地址:        localhost/c.do

    A存储数据时:    a/b可以获取 ,a/b可以替换.   c不能获取 也不能替换.
    C存储数据时: a/b/c可以获取 , c可以替换.


Cookie的路径问题, 经常影响我们的开发 . 
JavaWeb 给我们提供了一个Cookie的方法, 用于设置Cookie的路径.

通常我们会将cookie的路径设置为/ (根路径)

格式:    cookie.setPath("/");

Cookie的优缺点:

缺点:
    1.    Cookie存储的数据类型有限制 , 只能是字符串
    2.    数据存储的大小 ,有限制, 最大为4kb
    3.    数据存储在用户的计算机上 , 不安全
    4.    受限于用户的浏览器设置, 当浏览器禁止使用Cookie时 , cookie就无法再存储了.

优点:
    数据存储在客户端 , 分散了服务器的压力. 

Session技术 (会话)

基于Cookie实现的技术 ,  是Java中的一个键值对的容器.  就像我们常用的Map集合.

技术原理:
    1.    浏览器访问服务器时, 服务器可以选择创建Session对象.
    2.    session对象在创建时, 会生成一个id , 我们称其为sessionid , sessionid是Session的密钥, 是唯一的 !
    3.    session创建完毕后, 会自动将sessionid以cookie的形式 存储到用户的浏览器中.
    4.    当浏览器再次访问服务器时, 会自动携带sessionid 发送给服务器.
    5.    服务器得到sessionid后, 会去自动匹配找到对应的session对象, 供用户使用.

如何获取session对象

在Java中, session是一个Java对象, 对象的类型为:  HttpSession

获取Session对象的格式:

    格式1.    无参方法:
            HttpSession session = request.getSession();
            内部调用了 一参方法, 且传入true

    格式2.    一参方法
            HttpSession session = request.getSession(boolean isNew);
            用于获取session  参数:
            true:    根据当前浏览器传入的sessionid ,寻找session对象并返回 . 如果不存在 , 则创建新的session并返回
            false:    根据当前浏览器传入的sessionid ,寻找session对象并返回 . 如果不存在 , 则返回null;

session的常用方法

1.    存储数据
    session.setAttribute(String key,Object value);
2.    获取数据
    Object value = session.getAttribute(String key);
3.    删除数据
    session.removeAttribute(String key);

4.    销毁session (应用场景:    百分之99的情况是: 退出登录)
    session.invalidate();

session的存活时长

session的默认时长为:    30分钟! 
指的是:    举例用户的上一次访问大于30分钟后, session自动删除.

设置Session时长:

    方式1.    修改单个session的时长:
            session.setMaxInactiveInterval(int 秒);

    方式2.    修改tocmat下, 所有session的默认时长:
            独立环境:    寻找到tomcat/conf/web.xml文件
            开发环境:    寻找到Servers项目中的 web.xml

            修改web.xml中  session-config节点
                <session-config>
                    <session-timeout>数值分钟</session-timeout>
                </session-config>

session的优缺点

优点:
    1.    数据存储在服务器中, 安全.
    2.    session存储时的值类型为: Object , 可以存储任意类型数据.
    3.    可存储的数据大小, 理论上是无上限的. 

缺点:
    数据在服务器的内存中存储, 内存通常是有限的, 会对服务器造成大量的压力. 很容易耗尽服务器资源.

Cookie结束 和 Session技术 不是互斥的

Cookie和session是结合使用的.
    通常:
        对于安全不敏感的数据 . 建议使用Cookie存储
        对于安全敏感的数据, 建议使用session存储

        对于安全敏感, 且较大的数据, 存储在数据库.


11月      Java

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!