《文章转载》感谢CSDN小瘦马 讲讲cookie和session

感觉以后得用得着 这篇文章 感谢 小瘦马哥

以下都是个人见解,如有不妥欢迎指出。

1.Session是什么呢???

简单来说就是服务器给客户端的一个编号。当一台WWW服务器运行时,可能有若干个用户浏览正在运正在这台服务器上的网站。当每个用户首次与这台WWW服务器建立连接时,他就与这个服务器建立了一个Session(一个常见的错误是以为session在有客户端访问时就被创建,然而事实是直到某server端程序(如Servlet)调用HttpServletRequest.getSession(true)这样的语句时才会被创建)。 同时服务器会自动为其分配一个SessionID,用以标识这个用户的唯一身份。这个SessionID是由WWW服务器随机产生的一个由24个字符组成的字符串。

URL重定向的缺点 重定向有一些缺点:对所有的URL使用URL重写,包括超链接,form的action,和重定向的URL。每个引用你的站点的URL,以及那些返回给用户的URL(即使通过间接手段,比如服务器重定向中的Location字段)都要添加额外的信息。 
这意味着在你的站点上不能有任何静态的HTML页面(至少静态页面中不能有任何链接到站点动态页面的链接)。因此,每个页面都必须使用servlet或JSP动态生成。即使所有的页面都动态生成,如果用户离开了会话并通过书签或链接再次回来,会话的信息都会丢失,因为存储下来的链接含有错误的标识信息-该URL后面的SESSION ID已经过期了。

2.Cookies是什么呢???

就是服务器暂存放在你的电脑里的资料(.txt格式的文本文件),好让服务器用来辨认你的计算机。当你在浏览网站的时候,Web服务器会先送一小小资料放在你的计算机上,Cookies 会帮你在网站上所打的文字或是一些选择都记录下来。当下次你再访问同一个网站,Web服务器会先看看有没有它上次留下的Cookies资料,有的话,就会依据Cookie里的内容来判断使用者,送出特定的网页内容给你,当然还有其他作用。

3.区别 

  • cookie是在客户端保持状态(安全性差),而session是在服务器端保持状态(安全性高)。
  •  可在客户端设置cookie的存活时间,也可在服务端设置session的存活时间,在不设置条件的情况下两者都是在浏览器关闭后消失
  • session客户端也需要保存一个标识,一般通过cookie来实现的 ,如果客户端禁用了cookie ,session将使用重定向URL技术实现,就是在URL后加上 ;JSESSIONID=<%=session.getId()%> )(另一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。
4.会话cookie和持久cookie的区别  如果不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览会话期的cookie被称为会话cookie。会话cookie一般不保存在硬盘上而是保存在内存里。 
如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间。 
存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存的cookie,不同的浏览器有不同的处理方式。 
5.cookie的读取 
  • 调用request.getCookie 
要获取有浏览器发送来的cookie,需要调用HttpServletRequest的getCookies方法,这个调用返回Cookie对象的数组,对应由HTTP请求中Cookie报头输入的值。 
  • 对数组进行循环,调用每个cookie的getName方法,直到找到感兴趣的cookie为止 
cookie与你的主机(域)相关,而非你的servlet或JSP页面。因而,尽管你的servlet可能只发送了单个cookie,你也可能会得到许多不相关的cookie。 
例如: 
  1. String cookieName = “userID”;   
  2.     Cookie cookies[] = request.getCookies();   
  3.     if (cookies!=null){   
  4.         for(int i=0;i<cookies.length;i++){   
  5.     Cookie cookie = cookies;   
  6.     if (cookieName.equals(cookie.getName())){   
  7.         doSomethingWith(cookie.getValue());   
  8. }   
  9. }   
  10. }   
String cookieName = “userID”; 
    Cookie cookies[] = request.getCookies(); 
    if (cookies!=null){ 
        for(int i=0;i<cookies.length;i++){ 
    Cookie cookie = cookies; 
    if (cookieName.equals(cookie.getName())){ 
        doSomethingWith(cookie.getValue()); 
} 
} 
} 
6.用途:实现自动登录 
当用户在某个网站注册后,就会收到一个惟一用户ID的cookie。客户后来重新连接时,这个 
用户ID会自动返回,服务器对它进行检查,确定它是否为注册用户且选择了自动登录,从而使用户务需给出明确的用户名和密码,就可以访问服务器上的资源。 
7.用途:cookie检测网站初访者 
A.调用HttpServletRequest.getCookies()获取Cookie数组 
B.在循环中检索指定名字的cookie是否存在以及对应的值是否正确 
C.如果是则退出循环并设置区别标识 
D.根据区别标识判断用户是否为初访者从而进行不同的操作 
  • 使用cookie检测初访者的常见错误 
不能仅仅因为cookie数组中不存在在特定的数据项就认为用户是个初访者。如果cookie数组为null,客户可能是一个初访者,也可能是由于用户将cookie删除或禁用造成的结果。
但是,如果数组非null,也不过是显示客户曾经到过你的网站或域,并不能说明他们曾经访问过你的servlet。其它servlet、JSP页面以及非Java Web应用都可以设置cookie,依据路径的设置,其中的任何cookie都有可能返回给用户的浏览器。 
正确的做法是判断cookie数组是否为空且是否存在指定的Cookie对象且值正确。 
8.用途:cookie记录各个用户的访问计数 
  • 获取cookie数组中专门用于统计用户访问次数的cookie的值 
  • 将值转换成int型 
  • 将值加1并用原来的名称重新创建一个Cookie对象 
  • 重新设置最大时效 
  • 将新的cookie输出 
9.用途:显示每个客户的访问次数 
由于客户的访问次数是一个整型的变量,但session的属性类型中不能使用int,double,boolean等基本类型的变量,所以我们要用到这些基本类型的封装类型对象作为session对象中属性的值 
但像Integer是一种不可修改(Immutable)的数据结构:构建后就不能更改。这意味着每个请求都必须创建新的Integer对象,之后使用setAttribute来代替之前存在的老的属性的值。例如: 
  1. HttpSession session = request.getSession();   
  2. SomeImmutalbeClass value = (SomeImmutableClass)session.getAttribute(“SomeIdentifier”);   
  3. if (value= =null){   
  4.     value = new SomeImmutableClass(…); // 新创建一个不可更改对象    
  5. }else{   
  6.     value = new SomeImmutableClass(calculatedFrom(value)); // 对value重新计算后创建新的对象    
  7. }   
  8. session.setAttribute(“someIdentifier”,value); // 使用新创建的对象覆盖原来的老的对象   
HttpSession session = request.getSession(); 
SomeImmutalbeClass value = (SomeImmutableClass)session.getAttribute(“SomeIdentifier”); 
if (value= =null){ 
    value = new SomeImmutableClass(…); // 新创建一个不可更改对象 
}else{ 
    value = new SomeImmutableClass(calculatedFrom(value)); // 对value重新计算后创建新的对象 
} 
session.setAttribute(“someIdentifier”,value); // 使用新创建的对象覆盖原来的老的对象 
10.用途:累计用户的数据 

使用可变的数据结构,比如数组、List、Map或含有可写字段的应用程序专有的数据结构。通过这种方式,除非首次分配对象,否则不需要调用setAttribute。

  1. HttpSession session = request.getSession();   
  2. SomeMutableClass value = (SomeMutableClass)session.getAttribute(“someIdentifier”);   
  3. if(value = = null){   
  4.     value = new SomeMutableClass(…);   
  5.     session.setAttribute(“someIdentifier”,value);   
  6. }else{   
  7.     value.updateInternalAttribute(…);     // 如果已经存在该对象则更新其属性而不需重新设置属性    
  8. }   
原文地址:https://www.cnblogs.com/subtract/p/3032973.html