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中的数据也不会消失。 


原文地址:https://www.cnblogs.com/kingofkai/p/5868771.html