zoukankan      html  css  js  c++  java
  • Cookie-Session

      会话:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话

    Cookie

      Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。

    Cookie存储位置

      如果设置了Expires过期时间,那Cookie存储在硬盘上,如果没有设置,则存储在内存中,随着浏览器的关闭而消亡。

      Win7上Cookies硬盘上的位置:

      Cookie: C:/Users/[user name]/AppData/Roaming/Microsoft/Windows/Cookies/
                     C:/Users/[user name]/AppData/Roaming/Microsoft/Windows/Cookies/Low/

      其中的部分文件夹,操作系统给隐藏掉了,可直接输入地址来查找。

     


    HttpSession

      Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的HttpSession对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。


      在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。 Session和Cookie的主要区别在于: Cookie是把用户的数据写给用户的浏览器。 Session技术把用户的数据写到用户独占的session中。 Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象。


    Java Servlet中的域对象


      request,response对象针对每个用户的每次请求:每次请求都会重新创建这两个对象,所以这两个对象不能存储全局变量,可以用到的地方是请求转发,可以将本次请求的request对象传递到下一次。
      Servlet,ServletContext对象针对所有用户的所有请求,网站的第一个人访问的时候就会创建这些对象,之后会一直存在,知道服务器关闭。所以ServletContext可以存储全局信息,但是是针对所有用户的,比如网站访问量计数功能就可以使用该对象。缺点是所有对象都可以访问到。
      Cookie,Session对象针对每个用户的所有请求,当我们使用request.getSession()得到HttpSession对象时,服务器就会为它分配一个ID,然后每个用户自己的信息就存放到了不同的HttpSession对象中,响应返回,服务器将用户Session对象的ID以Cookie形式来保存,例如:
      Cookie:JSESSIONID=2DB77EDB2964DFC61828ECBCC8076258

      这样,浏览器每次请求服务器都会带上此Cookie来告诉服务器,嗨,老兄,ID为这个的HttpSession对象是我的,我要取出里面的信息。

      流程:

      1 第一次访问服务器的时候,会在响应头里面看到Set-Cookie信息(只有在首次访问服务器的时候才会在响应头中出现该信息)

      

      2 以后的每次请求,请求头中都会有此Cookie发给服务器

      

      问题:
      Session默认是需要Cookie支持的,但有些客户浏览器是关闭Cookie的,那我们是不是就无法使用Session了?
      解决:
      URL重写功能,为了防止一些用户把Cookie禁止而无法使用session而设置的功能。当检测到浏览器禁用Cookie时,将sessionid添加到URL后面,以此实现传到服务端的目的,这样无需cookie也可以使用session.
      形式:
      http://localhost/Web/B;jsessionid=2DB77EDB2964DFC61828ECBCC8076258?name=zz

      jessionid通过这样的方式来从客户端传递到服务器端,从而来标识session。注意一点,jsessionid跟一般的url参数传递方式是不同的,不是作为参数跟在?后面,而是紧跟在url后面用;来分隔。这样在用户禁用cookie的时候我们也可以传递jsessionid来使用session了.

      Session非活动时间:默认30分钟失效。
        void setMaxInactiveInterval(int interval);

      网站退出时应销毁所有Session。
        void invalidate();

      getSession()内部执行原理:
      第一次request.getSession(),创建本次会话对象。
      每次请求的request对象不同,但是request.getSession()得到的会话对象是同一个。
      问题:
      服务器如何判断getSession()是创建还是得到?
      解决:
      当创建了会话对象,服务端添加Cookie:sessionId=值,以后浏览器的请求都会带着这个Cookie,服务端以此Cookie来判断它是否已经创建了会话对象。
      注意:
      这里的sessionId只是个概念,寓意:标识会话的唯一值,在Tomcat中是JSESSIONID,在其它服务器,框架可能设置其它名字。

        request.getSession()等价于request.getSession(true),true的意思为:已经存在Session对象了,返回已存在对象。如果没有Session对象,则会创建新对象。


      序列化

      Tomcat的Work工作目录存储对象序列化,存储到了SESSION.ser文件。
      在HttpSession中存储的对象应该实现序列化接口,这样当服务器关闭,在重启之后,HttpSession中的数据也不会消失。 


  • 相关阅读:
    #sort 快速排序 20. 9.14
    #Trie Trie树调试模板 20.09.21
    #operator ——“Kruskal算法求最小生成树 中的 operator” ~20.8.17
    #STL #List 容器函数以及一些内置函数的用法
    刷题周记(三)——#最小生成树:Kruskal#二分图:染色法、匈牙利算法#拓扑#DFS:排列数字、n-皇后#BFS:走迷宫、八格码#List容器
    #周测 9 —— 高低位交换、Subsequences Summing to Sevens S、积木大赛、跳石头
    刷题周记(二)——KMP,Trie,最大异或对,(并查集)合并集合、连通块中点的数量、食物链,堆排序,单多源最短路、Dijkstra、bellman-ford、SPFA、Floyd、(堆优化)Prim
    4.SQL(数据库变更)
    3.SQL(查询)
    2.Oracle基本使用
  • 原文地址:https://www.cnblogs.com/kingofkai/p/5868771.html
Copyright © 2011-2022 走看看