目录

一.Cookie机制

二.Session机制

三.两者的区别


  1. Cookie机制
    1. 定义
    2. 原理
    3. 使用
      1. 创建Cookie,Cookies方法
      2. 访问Cookie
      3. 删除
  2. Session机制
    1. 定义
    2. 运行机制
    3. 使用
      1. 创建Session,Session方法
      2. 访问Session
      3. 删除 Session 会话数据
  3. 两者的区别
    1. 存取方式
    2. 安全性
    3. 有效期
    4. 服务器压力
    5. 浏览器支持
    6. 跨域支持上的不同

一.Cookie机制

1.定义

Cookies是存储在客户机的文本文件,它们保存了大量轨迹信息。在servlet技术基础上,JSP显然能够提供对HTTP cookies的支持。

2.原理:

  1. 客户端发送请求至服务器,包含一系列信息:比如名字,年龄,ID号码等到。
  2. 服务器将这些信息(比如名字,年龄,ID号码等等)保存在cookie中,通过响应将cookies发送至浏览器。
  3. 浏览器在本地机中存储这些信息,以备不时之需。
  4. 当下一次浏览器发送任何请求至服务器时,它会同时将这些cookies信息发送给服务器(cookie附在请求资源的HTTP请求头上发送给服务器。),然后服务器使用这些信息来识别用户或者干些其它事情。
    Cookie和Session详解及区别

Cookies 通常设置在 HTTP 头信息中(虽然 JavaScript 也可以直接在浏览器上设置一个 Cookie)。Cookie的内容主要包括:名字,值,过期时间,路径和域。
路径与域一起构成cookie的作用范围。
过期时间:
若不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失。这种生命期为浏览器会话期的cookie被称为会话cookie。会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。
若设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存里的cookie,不同的浏览器有不同的处理方式。

3.使用

1.创建:通过 Servlet 设置 Cookies 包括四个步骤:

  1. 创建一个 Cookie 对象:您可以调用带有 cookie 名称和 cookie 值的 Cookie 构造函数,cookie 名称和 cookie 值都是字符串。
    Cookie cookie = new Cookie("key","value");
    注意:无论是名字还是值,都不应该包含空格或以下任何字符:[ ] ( ) = , " / ? @ : ;
  2. 设置最大生存周期:您可以使用 setMaxAge 方法来指定 cookie 能够保持有效的时间(以秒为单位)。下面将设置一个最长有效期为 24 小时的 cookie。
    cookie.setMaxAge(60*60*24); //设置有效时间为一天
  3. 设置作用域:Path表示服务器的主机名,只有浏览器通过这个主机名访问服务器的时候,才会提交这个cookie到服务端
    cookie.setPath(""127.0.0.1");
  4.  发送 Cookie 到 HTTP 响应头:您可以使用 response.addCookie 来添加 HTTP 响应头中的 Cookies,如下所示:
    response.addCookie(cookie);

2.访问:通过 Servlet 读取 Cookies

要读取 Cookies,您需要通过调用 HttpServletRequest 的 getCookies( ) 方法创建一个 javax.servlet.http.Cookie 对象的数组。然后循环遍历数组,并使用 getName() 和 getValue() 方法来访问每个 cookie 和关联的值。

Cookie cookie = null;
Cookie[] cookies = null;
// 获取与该域相关的 Cookies 的数组
cookies = request.getCookies();

3.删除Cookies:通过 Servlet 删除 Cookies

删除 Cookies 是非常简单的。如果您想删除一个 cookie,那么您只需要按照以下三个步骤进行:

  1. 读取一个现有的 cookie,并把它存储在 Cookie 对象中。
  2. 使用 setMaxAge() 方法设置 cookie 的年龄为零,来删除现有的 cookie。
  3. 把这个 cookie 添加到响应头。

可以手动在 Internet Explorer 中删除 Cookies。在"工具"菜单,选择"Internet 选项"。如果要删除所有的 Cookies,请按"删除 Cookies"。

 

二.Session机制

1.定义

Session对应的中文翻译是会话。 
会话指的是从用户打开浏览器访问一个网站开始,无论在这个网站中访问了多少页面,点击了多少链接,都属于同一个会话。 直到该用户关闭浏览器为止,都属于同一个会话。

2.运行机制

  • 当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了一个session标识(称为sessionID),如果已包含则说明以前已经为此客户端创建过session,服务器就按照sessionID把这个session检索出来使用(检索不到,会新建一个),如果客户端请求不包含sessionID,则为此客户端创建一个session并且生成一个与此session相关联的sessionID,sessionID的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个sessionID将被在本次响应中返回给客户端保存。
    原理图:
    Cookie和Session详解及区别
  • 保存这个sessionID的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字都是类似于sessionID。但cookie可以被人为的禁止,则必须有其他机制以便在cookie被禁止时仍然能够把sessionID传递回服务器,可以使用下面的方法解决:
    如果浏览器把cookie功能关闭,那么服务端就无法获取jsessionid,每一次访问,且每次都会生成一个新的session对象。为了解决这个问题,可以使用
    response.encodeURL("getSession.jsp")
     
    response.encodeURL方法会把getSession.jsp这个url转换为
    getSession.jsp;jsessionid=22424AEA86ADBE89F335EEB649D997A8
     
    通过这个方式,提交jsessionid到服务器。 服务器根据这个jsessionid匹配到对应的session. 与session相关的功能,就可以正常工作了。
     
    例:
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8" import="javax.servlet.http.Cookie"%>
     
    <%session.setAttribute("name", "teemo");%>
     
    <a href="<%=response.encodeURL("getSession.jsp")%>">跳转到获取session的页面</a>

3.使用

  1. 创建:通过HttpSession对象
    Servlet 提供了 HttpSession 接口,该接口提供了一种跨多个页面请求或访问网站时识别用户以及存储有关用户信息的方式。
    Servlet 容器使用这个接口来创建一个 HTTP 客户端和 HTTP 服务器之间的 session 会话。会话持续一个指定的时间段,跨多个连接或页面请求。
    通过调用 HttpServletRequest 的公共方法 getSession() 来获取 HttpSession 对象,如下所示:
    HttpSession session = request.getSession();
    session.setAttribute("name", "teemo");//设值
    注意:在jsp中,9大隐式对象包含session,所以可以直接使用
    如:<%session.setAttribute("name","teemo");%>
  2. 设值
    String name = (String)session.getAttribute("name");
    
  3. 删除 Session 会话数据
    1. 设置session的有效期:比如登录一个网站,登录后,在短时间内,依然可以继续访问而不用重新登录。但是较长时间不登录,依然会要求重新登录,这是因为服务端的session在一段时间不使用后,就失效了。这个时间,在Tomcat默认配置下,是30分钟。
      可以通过 d:/tomcat/conf/web.xml 中的session-config 配置进行调整:
      <session-config>
          <session-timeout>15</session-timeout>
      </session-config>
      
      
    2. 移除一个特定的属性:您可以调用 public void removeAttribute(String name) 方法来删除与特定的键相关联的值。 to delete the value associated with a particular key.
    3. 删除整个 session 会话:您可以调用 public void invalidate() 方法来丢弃整个 session 会话。
    4. 设置 session 会话过期时间:您可以调用 public void setMaxInactiveInterval(int interval) 方法来单独设置 session 会话超时。和第一种方法的效果一样
    5. 注销用户:如果使用的是支持 servlet 2.4 的服务器,您可以调用 logout 来注销 Web 服务器的客户端,并把属于所有用户的所有 session 会话设置为无效。

 

三.两者的区别

Cookie与Session都能够进行会话跟踪,但是完成的原理不太一样。普通状况下二者均能够满足需求,但有时不能够运用Cookie,有时不能够运用Session。下面经过比拟阐明两者的特性以及适用的场所:

  1. 存取方式的不同
    Cookie中只能保管ASCII字符串,假如需求存取Unicode字符或者二进制数据,需求先进行编码。Cookie中也不能直接存取Java对象。若要存储略微复杂的信息,运用Cookie是比较艰难的。而Session中能够存取任何类型的数据,包括而不限于String、Integer、List、Map等。Session中也能够直接保管JavaBean乃至任何Java类,对象等,运用起来十分便当。能够把Session看做是一个Java容器类。
  2. 隐私策略的不同
    Cookie存储在客户端阅读器中,对客户端是可见的,客户端的一些程序可能会窥探、复制以至修正Cookie中的内容。而Session存储在服务器上,对客户端是透明的,不存在敏感信息泄露的风险。假如选用Cookie,比较好的方法是,敏感的信息如账号密码等尽量不要写到Cookie中。最好是像Google、Baidu那样将Cookie信息加密,提交到服务器后再进行解密,保证Cookie中的信息只要本人能读得懂。而假如选择Session就省事多了,反正是放在服务器上,Session里任何隐私都能够有效的保护。
  3. 有效期上的不同
    使用过Google的人都晓得,假如登录过Google,则Google的登录信息长期有效。用户不用每次访问都重新登录,Google会持久地记载该用户的登录信息。要到达这种效果,运用Cookie会是比较好的选择。只需要设置Cookie的过期时间属性为一个很大很大的数字。由于Session依赖于名为JSESSIONID的Cookie,而CookieJSESSIONID的过期时间默许为–1,只需关闭了阅读器该Session就会失效,因而Session不能完成信息永世有效的效果。运用URL地址重写也不能完成。而且假如设置Session的超时时间过长,服务器累计的Session就会越多,越容易招致内存溢出。
  4. 服务器压力的不同
    Session是保管在服务器端的,每个用户都会产生一个Session。假如并发访问的用户十分多,会产生十分多的Session,耗费大量的内存。因而像Google、Baidu、Sina这样并发访问量极高的网站,是不太可能运用Session来追踪客户会话的。而Cookie保管在客户端,不占用服务器资源。假如并发使用的用户十分多,Cookie是很好的选择。关于Google、Baidu、Sina来说,Cookie或许是唯一的选择。
  5. 浏览器支持的不同
    Cookie是需要客户端浏览器支持的。假如客户端禁用了Cookie,或者不支持Cookie,则会话跟踪会失效。关于WAP上的应用,常规的Cookie就派不上用场了。假如客户端浏览器不支持Cookie,需要运用Session以及URL地址重写。需要注意的是一切的用到Session程序的URL都要进行URL地址重写,否则Session会话跟踪还会失效。关于WAP应用来说,Session+URL地址重写或许是它唯一的选择。假如客户端支持Cookie,则Cookie既能够设为本浏览器窗口以及子窗口内有效(把过期时间设为–1),也能够设为一切阅读器窗口内有效(把过期时间设为某个大于0的整数)。但Session只能在本阅读器窗口以及其子窗口内有效。假如两个浏览器窗口互不相干,它们将运用两个不同的Session.
  6. 跨域支持上的不同(创建Cookie中第三步:3.设置作用域)
    Cookie支持跨域名访问,例如将domain属性设置为.biaodianfu.com,则以.biaodianfu.com为后缀的一切域名均能够访问该Cookie。跨域名Cookie如今被普遍用在网络中,例如Google、Baidu、Sina等。而Session则不会支持跨域名访问。Session仅在他所在的域名内有效。仅运用Cookie或者仅运用Session可能完成不了理想的效果。这时应该尝试一下同时运用Cookie与Session。Cookie与Session的搭配运用在实践项目中会完成很多意想不到的效果。

 

相关文章: