Cookie_Session

  1. 会话

    • 浏览器和服务器之间的多次请求和响应,浏览器和服务器之间可能会产生多次的请求和响应,从浏览器访问服务器开始,到访问服务器结束(关闭浏览器,到了过期时间)。这期间产生的多次请求和响应加在一起称之为浏览器和服务器之间的一次会话
    • 会话过程中产生的一起数据,可以通过会话技术(Cookie和Session)保存
  2. Cookie 客户端会话管理技术

    • 把要共享的数据保存到客户端,每次请求时,把会话信息带到服务器端,从而实现多次请求的数据共享

    • 作用:可以保存客户端访问网站的相关内容,从而保证每次访问时,先从本地缓存中获取,以此提高效率

    • 限制

      1. 每个网站最多只能有20个Cookie,大小不能超过4kb,所有网站的Cookie总数不能超过300个
      2. Cookie的名称只能包含ASCCI码表中的字母,数字字符。不能包含逗号,分号,空格,不能以$开头。
      3. Cookie值不支持中文
    • 属性

      1. name Cookie的名称
      2. value Cookie的值不支持中文
      3. path Cookie的路径
      4. domain Cookie的域名
      5. maxAge Cookie的存活时间
    • 方法

      1. Cookie(String name, String value)
      2. 在Servlet中响应设置,请求获取
      3. setMaxAge(>0的数) 秒数
        • 默认是-1
        • 负整数,当前会话有效,浏览器关闭则清楚
        • 0 立即清除
        • 正整数,以秒为单位设置存活时间
      4. 会生成一个缓存文件
      5. 访问路径
        • 取自第一次访问(设置Cookie)的资源路径前缀,只要以这个路径开头就能访问到 默认
        • 设置路径:setPath() 方法设置指定路径
    • Cookie是HTTP协议制定的(使用HTTP就可以使用)

    • 先由服务器保存Cookie到浏览器,下次浏览器请求服务器时把上一次请求得到的cookie再归还给服务器,保存在浏览器中

    • Cookie是一个键值对

      • 服务器给浏览器发送cookie:Set-Cookie: aaa=AAA Set-Cookie: bbb=BBB
        • response.addHeaer(“Set-Cookie”, “aaa=AAA”);
        • response.addHeaer(“Set-Cookie”, “bbb=BBB”);
      • 浏览器归还Cookie
        • 在请求头中包含信息:Cookie: aaa=AAA, bbb=BBB
    • HTTP协议规定

      • 一个Cookie最大4KB
      • 一个服务器最对向一个浏览器发送保存20个Cookie
      • 一个浏览器最多保存300个Cookie
    • JavaWeb中使用Cookie

      • 原始方式
        • 使用response发送Set-Cookie响应头
        • 使用request获取Cookie请求头
      • 便捷方式
        • response.addCookie() 向浏览器保存Cookie
        • request.getCookies() 获取浏览器归还的Cookie
      • Cookie是不能跨浏览器的
    • Cookie的可保存时长 cookie.setMaxAge(int expires(秒));

      • expires > 0:浏览器把Cookie保存到硬盘上,有效时长由time决定
      • expires < 0:Cookie只在浏览器的内存中存在,浏览器进程结束,Cookie就死亡(默认)
      • expires = 0:浏览器会马上删除这个Cookie
    • Cookie的路径(命名空间的作用)

      • 不是设置Cookie的保存路径
      • 创建Cookie时,设置Cookie的path属性,当浏览器访问路径包含path时,就归还这个Cookie
      • 默认值,当前访问路径的父路径
    • Cookie的domain 跨域的共享Cookie(了解)

      • 例如:www.baidu.com、zhidao.baidu.com、news.baidu.com、tieba.baidu.com之间共享Cookie时可以使用domain
      • 设置domain:cookie.setDomain(".baidu,com");
      • 设置path:cookie.setPath("/"); 必须是/
    • Cookie的属性

      属性项 描述
      Name=Value 键值对,Cookie的主体内容
      Expires 过期时间
      Domain 生成Cookie的域名
      Path 该Cookie是在当前的那个路径下生成的
      Secure 如果设置了这个属性,只会在SSH连接时才会归还Cookie
  3. HttpSession 服务器端会话管理技术

    • 本质也是采用客户端会话管理技术,只不过在客户端保存的是一个特殊标识,而共享数据保存到了服务端的内存对象中。每次请求时,会将特殊标识带到服务器端,根据这个标识来找到对应的内存空间,从而实现数据共享
    • 是Servlet规范中四大域对象之一,会话域对象,可以实现数据共享
    • 常用方法
      1. void setAttribute(String name, Object value)
      2. Object getAttribute(String name)
      3. void removeAttribute(String name)
      4. String getId() 获取那个特殊标识
      5. void Invalidate() 让session立即失效
    • 通过HttpRequest对象获取
      • getSession(boolean value) 默认是true,true获取不到Session对象会自动创建一个,false不会
    • 浏览器禁止使用Cookie,会话技术失效
      • 第一种方法URL后面添加 ;jsessionid=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
      • 第二中方法 在Servlet中把跳转路径用resp.encodeURL,进行URL重写,相当于1
    • 钝化,活化
      1. 钝化: 序列化,把长时间不用,但还不到过期时间的HttpSession进行序列化,写到磁盘上
      2. 活化:相反操作
      3. 什么时候钝化
        • 当访问量很大时,服务器会根据getLastAccessTime进行排序,对长时间不用,但是还没到过期时间的HttpSession进行序列化。
        • 当服务器进行重启的时候,为了保持客户的HttpSession中的数据,也要对其进行序列化
    • HttpSession的序列化由服务器自动完成,不需要我们关心
    • HttpSession是JavaWeb提供的,用来会话跟踪的类
    • 是服务端对象,保存在服务端
    • HttpSession是Servlet三大域之一,request,session,application(ServletContext),可以保存参数
      1. 会话:一个用户对服务器的多次连贯请求,请求中间没有关闭浏览器
    • session底层依赖Cookie或者是URL重写
    • JavaWeb中使用Session
      1. HttpSession session = request.getSession();
      2. session是JSP内置对象之一
        • void setAttribute(String name, Object value);
        • Object getAttribute(String name);
        • void removeAttribute(String name);
    • HttpSession原理
      1. request.getSession()方法
        // 找Cookie,Cookie里面找Session,没有就创建
        cookie = getCookie("sessionId");
        if (cookie == null) {
            create newCookie;
            addCookie(newCookie);
            create newSession;
            newCookie.addSession("sessionId", newSession);
        } else {
            session = cookie(sessionId);
            if (session == null) {
                create newSession;
                cookie.addSession("sessionId", newSession);
            } else {
                // 服务器不会马上创建session,在第一次获取session时,才会创建
                return session;
            }
        }
        
    • HttpSession其他方法
      1. String getId(); 获取SessionId
      2. int getMaxInactiveInterval(); 获取最大不活动时间(秒)
        • 默认是30分钟
        • 如果在最大活动事件内没有使用,Tomcat就会在session池中移除这个session
      3. void invalidate(); 让session失效
      4. boolean isNew(); 查看session是否为新
    • Session最大不活动时间
      • 在XML中配置session的最大不活动时间
        <session-config>
            <session-timeout>30</session-timeout>
        </session-config>
        
    • session之URL重写
      • session依赖Cookie,客户端发出请求时归还SessionId,去找对应的session
      • 如果客户端禁用Cookie,session就无法使用
      • 使用URL重写
        • 让网站的所有超链接、表单中都添加一个特殊的请求参数,即SessionId
        • 服务器可以通过获取请求参数得到sessionId,从而得到这个session对象
      • 方法
        • response.encodeURL(String url);
        • 该方法会对url进行智能重写,当请求中没有归还sessionId这个cookie,那么该方法会重写URL,否则不重写
上一篇:跨浏览器取同一个session


下一篇:从零到一编码实现Redis分布式锁