cookie 和 session

会话技术

  1. 会话:一次会话中包含多次请求和响应;

    ** 一次会话:浏览器第一次给服务器资源发送请求,会话建立; 直到有一方断开为止;

  2. 功能:在一次会话的范围内的多次请求,共享数据;

  3. 方式:

    a. 客户端会话技术:Cookie

    b. 服务端会话技术:session;

 

## cookie

  1.  概念:

    客户端会话技术,将数据保存在客户端;

  2. 在Servlet中,Cookie的存取

    * 服务端向客户端发送Cookie

      Cookie cookie = new Cookie("msg","Cookie测试应用");

      response.addCookie(cookie);

    * 服务端读取客户端提交的Cookie

      Cookie[] cookies = request.getCookies();

      for (Cookie cookie : cookies) {

          String name = cookie.getName();

          String value = cookie.getValue();

          System.out.println(name+" --> "+value);

      }

   3. 实现原理

    * 基于响应头 set-cookie 和 请求头 cookie 实现;

   4. cookie  的细节

    a. 一次可不可以发送多个cookie;

      * 可以创建多个cookie 对象,并调用 addcookie添加;

    b. cookie 在浏览器中保存多久呢?

      * 默认情况下,当浏览器关闭后,Cookie数据被销毁;

      * 持久化存储

        * setMaxAge( int seconds)

          > 正数:将Cookie数据写到硬盘的文件中,持久化存储;cookie存活时间;seconds 秒后删除cookie文件

          > 负数: 默认值;

          > 0: 删除cookie信息

    c. cookie能不能保存中文?

      * 在 tomcat 8 之前,cookie中不能直接存储中文数据; (转码后可存储,一般转为url编码)

         在 tomcat 8 之后,cookie支持中文数据; 

    d. cookie共享问题?

      * 假设在tomcat服务器中部署了多个web项目,那么在这些web项目中, cookie能不能共享?

        * 默认情况下,cookie 不共享;

        * setPath(String path):  设置 cookie 的获取范围。默认情况下,设置墚前的虚拟目录;

         如果要共享,则可以将path设置为 "/";  

      

 

      * 不同的 TomCat 服务器之间 cookie 共享问题;

        * setDomain(String path): 如果设置一级域名相同,则 多个服务器之间cookie可以共享;

           >>  setDomain(".baidu.com"), 那么   tieba.baidu.com 和  news.baidu.com 之间 cookie可以共享;

  5. cookie 特点

    a. cookie 存储数据在客户端浏览器;

    b. 浏览器对于单个cookie的大小有限制 (4kb);对同一个域名下的总cookie数量也有限制 (一般20个以内);  

    ** 作用

      1. cookie 一般用于存储少量不太敏感的数据;

      2. 在不登陆的情况下,完成服务器对客户端的身份识别;          

 

## Session

  1. 概念:服务端会话技术,在一次会话的多次请求中共享数据,将数据保存在服务器端的对象中( HttpSession );

  2. Session的设置

    * HttpSession session = request.getSession();

      session.setAttribute("msg","你好呀Session");

    Session的读取

    * HttpSession session = request.getSession();

      Object msg = session.getAttribute("msg");

      System.out.println(msg);

  3. Session实现的原理

    >> Session的实现,是依赖于Cookie的;

      通过 cookie中配置 JSESSIONID 参数来标识 Session对象;

    

   4. Session的细节

    a. 当客户端关闭后,服务器不关闭,二次获取的Session是否为同一个?

      >> 默认情况下是不一样的

      >> 若需要关闭客户端后再次打开,仍然是同一个Session, 可按如下方法配置;

        

 

     b. 客户端不关闭,服务器关闭后,两次获取的session是同一个吗?

      >> 不是同一个,但需要确保数据的不丢失,tomcat自动完成了如下的工作;

        > session的钝化:  在服务器正常关闭之前,将session对象系列化到硬盘上;

        > session的活化:在服务器启动后,将session文件转化为内存中的session对象;

      >> session的钝化与活化,在IDEA中无法完成,需要在tomcat服务来完成;

        IDEA下无法完成的的原因是,每次运行时,IDEA会删除 work目录,而session序列化的文件就在work目录中;

     c. Session什么时候销毁

      1>. 服务器关闭时;

      2>. session对象调用 invalidate();

      3>. session默认失效时间为 30 分钟

        在 tomcat安装目录/conf/web.xml ;   可以依据实际项目应用需求配置

        

   5. Session的特点

    a. session用于存储一次会话的多次请求的数据,存在服务器;

    b. session可以存储任意类型, 任意大小的数据;

    * session 与 cookie 的区别

      > session 存储数据在服务器端, cookie在客户端;

      > session 没有数据大小限制,cookie有;

      > session 数据安全,cookie相对来说没有session安全;

 

 ## 关于服务端的 转发 与 重定向

  转发:

    request.getRequestDispatcher("目标URL").forward(request, response);    

    转发过程中,可以通过 request.setAttribute ("参数名", "参数值") 来共享数据;

  重定向

    response.sendRedirect(request.getContextPath()+"目标URL");

    重定向时,客户端会重新发起一次请求,可以通过 Session 来共享数据;  

 

    

posted @ 2022-04-03 17:29  耗喜天涯  阅读(30)  评论(0编辑  收藏  举报