zoukankan      html  css  js  c++  java
  • Cookie和Session的底层实现原理

    一、Cookie

    Cookie的特性:会话数据保存在浏览器客户端

    Cookie的底层实现原理:

     1)服务器创建cookie对象,把会话数据存储到cookie对象中。

          new Cookie("name","value");

     2)服务器发送cookie信息到浏览器

          response.addCookie(cookie);

     3)浏览器从响应头中得到服务器发送的Cookie然后保存到浏览器本地。

    原理图如下所示:

    服务器怎样获取Cookie?

    浏览器在下次访问服务器时,会将本地存放的Cookie信息通过请求头的方式发送给服务器

    Cookie易错点:

    1)Cookie不能跨浏览器

    2)Cookie默认关闭浏览器失效。如果不想让Cookie默认关闭浏览器失效,可以使用setMaxAge(int expiry) 来设置有效时间

          正整数:表示保存的时间,以秒为单位

         负整数:表示浏览器关闭cookie就失效了!

         零:表示删除同名的cookie数据

    3)Cookie数据类型只能保存非中文字符串类型。可以保存多个cookie,但是浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。

    4)Cookie的不可跨域名性

    二、Session

    Session的特性:会话数据保存在服务器端

    Session底层实现原理:

    服务器创建一个session之后,会在响应头里面将sessionId返回给浏览器。浏览器从响应头中获取sessionId,然后保存在浏览器本地。

    具体步骤如下:

    1)服务器创建session对象

          HttpSession session=req.getSession();

          默认是true,表示如果没有session,就会创建一个session

          如果是false,表示如果没有找到session,不会创建一个session

    2)设置session对象

          void setMaxInactiveInterval(int interval)  : 设置session的有效时间

    3)保存会话数据到session对象

         void setAttribute(java.lang.String name, java.lang.Object value)  

    4)服务器通过响应头将sessionId返回给浏览器

    5)浏览器从响应头中获取sessionId保存到本地硬盘

    原理图如下所示:

    服务器怎样获取session?

    浏览器在下次访问服务器的时候,会将本地存放的sessionId通过请求头的方式发送给服务器

     Session易错点:

    1)两个getSession方法:

        getSession(true) / getSession()  : 创建或得到session对象,如果没有匹配的sessionId,自动创建新的session对象。

        getSession(false): 得到session对象,如果没有匹配的sessionId,不创建

    2)session默认情况下30分钟服务器自动回收。如果想要修改session回收时间可以用setMaxInactiveInterval(int interval)

    3)关闭浏览器session不会失效(因为session保存在服务器端),但是sessionId会失效(因为sessionId保存在浏览器端)

  • 相关阅读:
    BZOJ_2002_[Hnoi2010]Bounce 弹飞绵羊_LCT
    BZOJ_4154_[Ipsc2015]Generating Synergy_KDTree
    BZOJ_2801_[Poi2012]Minimalist Security_dfs树+特判+乱搞
    BZOJ_3123_[Sdoi2013]森林_主席树+启发式合并
    2019集训队作业做题实况[1](1-30):
    牛客挑战赛33 F 淳平的形态形成场(无向图计数,EGF,多项式求逆)
    【NOIP2019模拟2019.10.07】果实摘取 (约瑟夫环、Mobius反演、类欧、Stern-Brocot Tree)
    CodeChef Max-digit Tree(动态规划)
    骚操作:c++如何用goto便捷地写人工栈?
    Comet OJ
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13309487.html
Copyright © 2011-2022 走看看