[PHP] 05 - Cookie & Session

故事背景


同 http, html, REST API 同样属于基础性的知识内容。javascript

[Node.js] 07 - Html and Httpphp

[Node.js] 08 - Web Server and REST APIhtml

理解Cookie和Session机制【知识体系比较全】java

 

 

Cookie


1、服务器端设置Cookie

<?php
  setcookie("user", "runoob", time()+3600);
?>

--------------------------------------------
<?php   $expire=time()+60*60*24*30;   setcookie("user", "runoob", $expire); ?>
<html>  // 要在此以前 .....

在发送 cookie 时,cookie 的值会自动进行 URL 编码,,在取回时进行自动解码。web

 

  • expire设置为过去时 - 删除 Cookie
<?php
// 设置 cookie 过时时间为过去 1 小时
setcookie("user", "", time()-3600);
?>

 

 

2、是否已设置了 cookie

<html>
<head>
  <meta charset="utf-8">
  <title>菜鸟教程(runoob.com)</title>
</head>
<body>

  <?php
  if (isset($_COOKIE["user"]))  # 这个变量存在否?
      echo "欢迎 " . $_COOKIE["user"] . "!<br>";
  else
      echo "普通访客!<br>";
  ?>

</body>
</html>

 

 

3、浏览器不支持cookie

Ref: 浏览器不支持cookie的解决办法【图文】算法

浏览器不支持cookie的缘由之一就是浏览器设置的问题。用户的浏览器设置了比较高的保护级别,当使用的网页不是比较有名的名站的话,就会被浏览器误认为是钓鱼网站或者是携带了木马的网站。sql

另外一个致使不支持浏览器cookie的缘由就是浏览器文件损坏或者是系统文件损坏。数据库

除了上述两种故障缘由以外,发生浏览器不支持cookie的缘由还多是因为某一个网站自己的问题。例如,一些网站服务器或者网页自己脚本的问题。vim

 

 

  

Session


在因特网上问题出现了:因为 HTTP 地址没法保持状态,Web 服务器并不知道您是谁以及您作了什么。跨域

Session 的工做机制是:为每一个访客建立一个惟一的 id (UID),并基于这个 UID 来存储变量。UID 存储在 cookie 中,或者经过 URL 进行传导。

 

1、存储 Session 变量 

<?php
session_start();
// 存储 session 数据
$_SESSION['views']=1;
?>

------------------------------------- <html> <head>   <meta charset="utf-8">   <title>菜鸟教程(runoob.com)</title> </head> <body>   <?php   // 检索 session 数据   echo "浏览量:". $_SESSION['views'];   ?> </body> </html>

  

  • 销毁 session
<?php
session_start();
if(isset($_SESSION['views']))
{
    unset($_SESSION['views']);   # 释放指定的 session 变量
}
?>
-----------------------------------
<?php session_destroy();       # 重置 session,将失去全部已存储的 session 数据 ?>

 

  

2、简单的 page-view 计数器

<?php
session_start();

if(isset($_SESSION['views']))
{
    $_SESSION['views']=$_SESSION['views']+1;
}
else
{
    $_SESSION['views']=1;
}
echo "浏览量:". $_SESSION['views'];
?>

 

 

 

深刻理解 Cookie 和 Session 机制


1、前言

经常使用的会话跟踪技术是Cookie与Session。

    • Cookie经过在客户端记录信息肯定用户身份,
    • Session经过在服务器端记录信息肯定用户身份。

问题:

比较说明何时不能用Cookie,何时不能用Session。

 

 

2、Cookie 基本认识

  • 基本理解

Cookie就是由服务器发给客户端的特殊信息,以文本文件的方式存放在客户端。

而后客户端每次向服务器发送请求的时候都会带上这些特殊的信息

 

  • 让咱们说得更具体一些

[1] 请求响应

当用户使用浏览器访问一个支持Cookie的网站的时候,用户会提供包括用户名在内的我的信息而且提交至服务器;

接着,服务器在向客户端回传相应的超文本的同时也会发回这些我的信息,存放于HTTP响应头(Response Header)

 

[2] 收到服务器的首次响应

当客户端浏览器接收到来自服务器的响应以后,浏览器会将这些信息存放在一个统一的位置:

对于Windows操做系统而言,咱们能够从: [系统盘]:\Documents and Settings\[用户名]\Cookies目录中找到存储的Cookie;

  

[3] 再次访问

自此,客户端再向服务器发送请求的时候,都会把相应的Cookie再次发回至服务器。

而此次,Cookie信息则存放在HTTP请求头(Request Header)了。

 

[4] 达到的效果

有了Cookie这样的技术实现,服务器在接收到来自客户端浏览器的请求以后,就可以经过分析存放于请求头的Cookie获得客户端特有的信息,从而动态生成与该客户端相对应的内容。

一般,咱们能够从不少网站的登陆界面中看到“请记住我”这样的选项,若是你勾选了它以后再登陆,那么在下一次访问该网站的时候就不须要进行重复而繁琐的登陆动做了,而这个功能就是经过Cookie实现的。

 

  • 同一个会话,若干次cookie请求

在程序中,会话跟踪是很重要的事情。理论上,一个用户的全部请求操做都应该属于同一个会话,而另外一个用户的全部请求操做则应该属于另外一个会话,两者不能混淆。

例如,用户A在超市购买的任何商品都应该放在A的购物车内,不管是用户A什么时间购买的,这都是属于同一个会话的,不能放入用户B或用户C的购物车内,这不属于同一个会话。

 

  • Session 以前的方案

而Web应用程序是使用HTTP协议传输数据的。HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的链接就会关闭,再次交换数据须要创建新的链接。这就意味着服务器没法从链接上跟踪会话。即用户A购买了一件商品放入购物车内,当再次购买商品时服务器已经没法判断该购买行为是属于用户A的会话仍是用户B的会话了。要跟踪该会话,必须引入一种机制。

Cookie就是这样的一种机制。它能够弥补HTTP协议无状态的不足。在Session出现以前,基本上全部的网站都采用Cookie来跟踪会话。

 

  • 算是http的扩展

若是你把Cookies当作为http协议的一个扩展的话,理解起来就容易的多了,其实本质上cookies就是http的一个扩展。有两个http头部是专门负责设置以及发送cookie的,它们分别是Set-Cookie以及Cookie。

当服务器返回给客户端一个http响应信息时,其中若是包含Set-Cookie这个头部时,意思就是指示客户端创建一个cookie,而且在后续的http请求中自动发送这个cookie到服务器端,直到这个cookie过时。

 

  • 生命周期

若是cookie的生存时间是整个会话期间的话,那么浏览器会将cookie保存在内存中,浏览器关闭时就会自动清除这个cookie。

另一种状况就是保存在客户端的硬盘中,浏览器关闭的话,该cookie也不会被清除,下次打开浏览器访问对应网站时,这个cookie就会自动再次发送到服务器端。

一个cookie的设置以及发送过程分为如下四步: 

 

  • 有可能被禁用

这两种传递数据的方式,比起用cookies来传递数据更稳定,由于cookie可能被禁用,可是以GET以及POST方式传递数据时,不存在这种状况。

GET /index.php?foo=bar HTTP/1.1 Host: example.org
----------------------------------------------------------------------------------------------------------------------
POST
/index.php HTTP/1.1 Host: example.org Content-Type: application/x-www-form-urlencoded Content-Length: 7 foo=bar

---------------------------------------------------------------------------------------------------------------------- POST
/index.php?myget=foo HTTP/1.1 Host: example.orgContent-Type: application/x-www-form-urlencoded Content-Length: 11 mypost=bar

 

  • 不可跨域名性

Cookie对象使用key-value属性对的形式保存用户状态,一个Cookie对象保存一个属性对,一个request或者response同时使用多个Cookie。

根据Cookie规范,浏览器访问Google只会携带Google的Cookie,而不会携带Baidu的Cookie。Google也只能操做Google的Cookie,而不能操做Baidu的Cookie。

 

 

3、Cookie 深刻认识

  • Unicode编码:保存中文

中文与英文字符不一样,中文属于Unicode字符,在内存中占4个字符,而英文属于ASCII字符,内存中只占2个字节。Cookie中使用Unicode字符时须要对Unicode字符进行编码,不然会乱码。

提示:Cookie中保存中文只能编码。通常使用UTF-8编码便可。不推荐使用GBK等中文编码,由于浏览器不必定支持,并且JavaScript也不支持GBK编码。

 

  • BASE64编码:保存二进制图片

Cookie不只可使用ASCII字符与Unicode字符,还可使用二进制数据。例如在Cookie中使用数字证书,提供安全度。使用二进制数据时也须要进行编码。

注意:本程序仅用于展现Cookie中能够存储二进制内容,并不实用。因为浏览器每次请求服务器都会携带Cookie,所以Cookie内容不宜过多,不然影响速度。Cookie的内容应该少而精。

 

  • 设置 Cookie 的全部属性

除了name与value以外,Cookie还具备其余几个经常使用的属性。每一个属性对应一个getter方法与一个setter方法。Cookie类的全部属性以下所示。

String name:该Cookie的名称。Cookie一旦建立,名称便不可更改。

Object value:该Cookie的值。若是值为Unicode字符,须要为字符编码。若是值为二进制数据,则须要使用BASE64编码。

int maxAge:该Cookie失效的时间,单位秒。

若是为正数,则该Cookie在>maxAge秒以后失效。

若是为负数,该Cookie为临时Cookie,关闭浏览器即失效,浏览器也不会以任何形式保存该Cookie。

若是为零,表示删除该Cookie。默认为–1。

boolean secure:该Cookie是否仅被使用安全协议传输。安全协议。安全协议有HTTPS,SSL等,在网络上传输数据以前先将数据加密。默认为false。

String path:该Cookie的使用路径。若是设置为“/sessionWeb/”,则只有contextPath为“/sessionWeb”的程序能够访问该Cookie。若是设置为“/”,则本域名下contextPath均可以访问该Cookie。注意最后一个字符必须为“/”。

String domain:能够访问该Cookie的域名。若是设置为“.google.com”,则全部以“google.com”结尾的域名均可以访问该Cookie。注意第一个字符必须为“.”。

String comment:该Cookie的用处说明。浏览器显示Cookie信息的时候显示该说明。

int version:该Cookie使>用的版本号。

0 - 表示遵循Netscape的Cookie规范,

1 - 表示遵循W3C的RFC 2109规范。

 

  • Cookie 的有效期

Cookie的maxAge决定着Cookie的有效期,单位为秒(Second)。Cookie中经过getMaxAge()方法与setMaxAge(int maxAge)方法来读写maxAge属性。

[1] 若是maxAge属性为正数,则表示该Cookie会在maxAge秒以后自动失效。浏览器会将maxAge为正数的Cookie持久化,即写到对应的Cookie文件中。不管客户关闭了浏览器仍是电脑,只要还在maxAge秒以前,登陆网站时该Cookie仍然有效。下面代码中的Cookie信息将永远有效。

Cookie cookie = new Cookie("username", "helloweenvsfei"); // 新建Cookie
cookie.setMaxAge(Integer.MAX_VALUE);                      // 设置生命周期为MAX_VALUE
response.addCookie(cookie);                               // 输出到客户端

[2] 若是maxAge为负数,则表示该Cookie仅在本浏览器窗口以及本窗口打开的子窗口内有效,关闭窗口后该Cookie即失效。maxAge为负数的Cookie,为临时性Cookie,不会被持久化,不会被写到Cookie文件中。Cookie信息保存在浏览器内存中,所以关闭浏览器该Cookie就消失了。Cookie默认的maxAge值为–1。

[3] 若是maxAge为0,则表示删除该Cookie。Cookie机制没有提供删除Cookie的方法,所以经过设置该Cookie即时失效实现删除Cookie的效果。失效的Cookie会被浏览器从Cookie文件或者内存中删除:

Cookie cookie = new Cookie("username", "helloweenvsfei"); // 新建Cookie
cookie.setMaxAge(0);                                      // 设置生命周期为0,不能为负数
response.addCookie(cookie);                               // 必须执行这一句

 

  • 使用 Cookie

response对象提供的Cookie操做方法只有一个添加操做add(Cookie cookie)。要想修改Cookie只能使用一个同名的Cookie来覆盖原来的Cookie,达到修改的目的。删除时只须要把maxAge修改成0便可。

注意:从客户端读取Cookie时,包括maxAge在内的其余属性都是不可读的,也不会被提交。

    • 浏览器提交Cookie时只会提交name与value属性。
    • maxAge属性只被浏览器用来判断Cookie是否过时。

 

$ vim .mozilla/firefox/6lpoihdv.default/cookies.sqlite

 

  • Cookie 的修改、删除

Cookie并不提供修改、删除操做。若是要修改某个Cookie,只须要新建一个同名的Cookie,添加到response中覆盖原来的Cookie。若是要删除某个Cookie,只须要新建一个同名的Cookie,并将maxAge设置为0,并添加到response中覆盖原来的Cookie。注意是0而不是负数。负数表明其余的意义。读者能够经过上例的程序进行验证,设置不一样的属性。

注意:修改、删除Cookie时,新建的Cookie除value、maxAge以外的全部属性,例如name、path、domain等,都要与原Cookie彻底同样。不然,浏览器将视为两个不一样的Cookie不予覆盖,致使修改、删除失败。

 

  • Cookie 的域名

Cookie 是不可跨域名的。域名www.google.com颁发的Cookie不会被提交到域名www.baidu.com去。这是由Cookie的隐私安全机制决定的。隐私安全机制可以禁止网站非法获取其余网站的Cookie。

正常状况下,同一个一级域名下的两个二级域名如www.helloweenvsfei.com和images.helloweenvsfei.com也不能交互使用Cookie,由于两者的域名并不严格相同。若是想全部helloweenvsfei.com名下的二级域名均可以使用该Cookie,须要设置Cookie的domain参数,例如:

Cookie cookie = new Cookie("time","20080808"); // 新建Cookie
cookie.setDomain(".helloweenvsfei.com");       // 设置域名
cookie.setPath("/");                           // 设置路径
cookie.setMaxAge(Integer.MAX_VALUE);           // 设置有效期
response.addCookie(cookie);                    // 输出到客户端

读者能够修改本机C:\WINDOWS\system32\drivers\etc下的hosts文件来配置多个临时域名,

而后使用setCookie.jsp程序来设置跨域名Cookie验证domain属性。

注意:domain参数必须以点(".")开始。另外,name相同但domain不一样的两个Cookie是两个不一样的Cookie。若是想要两个域名彻底不一样的网站共有Cookie,能够生成两个Cookie,domain属性分别为两个域名,输出到客户端。

  

  • Cookie 的路径

domain属性决定运行访问Cookie的域名,而path属性决定容许访问Cookie的路径(ContextPath)。例如,若是只容许/sessionWeb/下的程序使用Cookie,能够这么写:

Cookie cookie = new Cookie("time","20080808"); // 新建Cookie
cookie.setPath("/session/");                   // 设置路径
response.addCookie(cookie);                    // 输出到客户端

设置为“/”时容许全部路径使用Cookie。path属性须要使用符号“/”结尾。name相同但domain不一样的两个Cookie也是两个不一样的Cookie。

注意:页面只能获取它属于的Path的Cookie。例如/session/test/a.jsp不能获取到路径为/session/abc/的Cookie。使用时必定要注意。

    1. domain表示的是cookie所在的域,默认为请求的地址,如网址为www.test.com/test/test.aspx,那么domain默认为www.test.com。而跨域访问,如域A为t1.test.com,域B为t2.test.com,那么在域A生产一个令域A和域B都能访问的cookie就要将该cookie的domain设置为.test.com;若是要在域A生产一个令域A不能访问而域B能访问的cookie就要将该cookie的domain设置为t2.test.com。

    2. path表示cookie所在的目录,默认为/,就是根目录。在同一个服务器上有目录以下:/test/,/test/cd/,/test/dd/,现设一个cookie1的path为/test/,cookie2的path为/test/cd/,那么test下的全部页面均可以访问到cookie1,而/test/和/test/dd/的子页面不能访问cookie2。这是由于cookie能让其path路径下的页面访问。

    3. 浏览器会将domain和path都相同的cookie保存在一个文件里,cookie间用*隔开。

 

  • Cookie的安全属性

HTTP协议不只是无状态的,并且是不安全的。使用HTTP协议的数据不通过任何加密就直接在网络上传播,有被截获的可能。使用HTTP协议传输很机密的内容是一种隐患。

若是不但愿Cookie在HTTP等非安全协议中传输,能够设置Cookie的secure属性为true。浏览器只会在HTTPS和SSL等安全协议中传输此类Cookie。下面的代码设置secure属性为true:

Cookie cookie = new Cookie("time", "20080808"); // 新建Cookie
cookie.setSecure(true);                         // 设置安全属性
response.addCookie(cookie);                     // 输出到客户端

提示:secure属性并不能对Cookie内容加密,于是不能保证绝对的安全性。若是须要高安全性,须要在程序中对Cookie内容加密、解密,以防泄密。

 

  • JavaScript 操做 Cookie

Cookie是保存在浏览器端的,所以浏览器具备操做Cookie的先决条件。浏览器可使用脚本程序如JavaScript或者VBScript等操做Cookie。这里以JavaScript为例介绍经常使用的Cookie操做。例以下面的代码会输出本页面全部的Cookie。

<script>document.write(document.cookie);</script> 

因为JavaScript可以任意地读写Cookie,有些好事者便想使用JavaScript程序去窥探用户在其余网站的Cookie。不过这是徒劳的,W3C组织早就意识到JavaScript对Cookie的读写所带来的安全隐患并加以防备了,W3C标准的浏览器会阻止JavaScript读写任何不属于本身网站的Cookie。换句话说,A网站的JavaScript程序读写B网站的Cookie不会有任何结果。

 

  • 案例:永久登陆

通常不把密码等重要信息保存到Cookie中。

采用另外一种方案,只在登陆时查询一次数据库,之后访问验证登陆信息时再也不查询数据库。

    1. 把帐号按照必定的规则加密后,连同帐号一块保存到Cookie中。
    2. 下次访问时只须要判断帐号的加密规则是否正确便可。

本例把帐号保存到名为 account 的Cookie中,把帐号连同密钥用MD1算法加密后保存到名为ssid的Cookie中。验证时验证Cookie中的帐号与密钥加密后是否与Cookie中的ssid相等。

提示:该加密机制中最重要的部分为算法与密钥。因为MD1算法的不可逆性,即便用户知道了帐号与加密后的字符串,也不可能解密获得密钥。所以,只要保管好密钥与算法,该机制就是安全的。 

 

 

4、Session机制

除了使用Cookie,Web应用程序中还常用Session来记录客户端状态

Session是服务器端使用的一种记录客户端状态的机制,使用上比Cookie简单一些,相应的也增长了服务器的存储压力

 

Session技术则是服务端的解决方案,它是经过服务器来保持状态的。

因为Session这个词汇包含的语义不少,所以须要在这里明确一下 Session的含义。

 * 首先,咱们一般都会把Session翻译成会话,所以咱们能够把客户端浏览器与服务器之间一系列交互的动做称为一个 Session。

从这个语义出发,咱们会提到Session持续的时间,会提到在Session过程当中进行了什么操做等等;

 * 其次,Session指的是服务器端为客户端所开辟的存储空间,在其中保存的信息就是用于保持状态。

从这个语义出发,咱们则会提到往Session中存放什么内容,如何根据键值从 Session中获取匹配的内容等。

    1. 要使用Session,第一步固然是建立Session了。那么Session在什么时候建立呢?固然仍是在服务器端程序运行的过程当中建立的,不一样语言实现的应用程序有不一样建立Session的方法,而在Java中是经过调用HttpServletRequest的getSession方法(使用true做为参数)建立的。
    2. 在建立了Session的同时,服务器会为该Session生成惟一的Session id,而这个Session id在随后的请求中会被用来从新得到已经建立的Session;
    3. 在Session被建立以后,就能够调用Session相关的方法往Session中增长内容了,而这些内容只会保存在服务器中,发到客户端的只有Session id
    4. 当客户端再次发送请求的时候,会将这个Session id带上,服务器接受到请求以后就会依据Session id找到相应的Session,从而再次使用之。正式这样一个过程,用户的状态也就得以保持了。

 

若是说Cookie机制是经过检查客户身上的“通行证”来肯定客户身份的话,那么Session机制就是经过检查服务器上的“客户明细表”来确认客户身份。

Session至关于程序在服务器上创建的一份客户档案,客户来访的时候只须要查询客户档案表就能够了。【状态保存】

登陆界面验证用户登陆信息,若是登陆正确,就把用户信息以及登陆时间保存进Session,而后转到欢迎页面welcome.jsp。

 

注意:程序中Session中直接保存了Person类对象与Date类对象,使用起来要比Cookie方便。当多个客户端执行程序时,服务器会保存多个客户端的Session。获取Session的时候也不须要声明获取谁的Session。Session机制决定了当前客户只会获取到本身的Session,而不会获取到别人的Session。各客户的Session也彼此独立,互不可见。

提示:Session的使用比Cookie方便,可是过多的Session存储在服务器内存中,会对服务器形成压力。

 

  • Session 的生命周期

Session保存在服务器端。为了得到更高的存取速度,服务器通常把Session放在内存里。每一个用户都会有一个独立的Session。若是Session内容过于复杂,当大量客户访问服务器时可能会致使内存溢出。所以,Session里的信息应该尽可能精简。

Session在用户第一次访问服务器的时候自动建立。须要注意只有访问JSP、Servlet等程序时才会建立Session,只访问HTML、IMAGE等静态资源并不会建立Session。若是还没有生成Session,也可使用request.getSession(true)强制生成Session。

Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session。用户每访问服务器一次,不管是否读写Session,服务器都认为该用户的Session“活跃(active)”了一次。

 

  • Session 的有效期

因为会有愈来愈多的用户访问服务器,所以Session也会愈来愈多。为防止内存溢出,服务器会把长时间内没有活跃的Session从内存删除。这个时间就是Session的超时时间。若是超过了超时时间没访问过服务器,Session就自动失效了。

Session的超时时间为maxInactiveInterval属性,能够经过对应的getMaxInactiveInterval()获取,经过setMaxInactiveInterval(longinterval)修改。

Session的超时时间也能够在web.xml中修改。另外,经过调用Session的invalidate()方法可使Session失效。

 

  • Session 的经常使用方法
void setAttribute(String attribute, Object value): 设置Session属性。value参数能够为任何Java Object。一般为Java Bean。value信息不宜过大 
String getAttribute(String attribute):             返回Session属性 
Enumeration getAttributeNames():                   返回Session中存在的属性名 
void removeAttribute(String attribute):            移除Session属性 
String getId():                                    返回Session的ID。该ID由服务器自动建立,不会重复 
long getCreationTime():                            返回Session的建立日期。返回类型为long,常被转化为Date类型,例如:Date createTime = new Date(session.get >CreationTime()) 
long getLastAccessedTime():                        返回Session的最后活跃时间。返回类型为long 
int getMaxInactiveInterval():                      返回Session的超时时间。单位为秒。超过该时间没有访问,服务器认为该Session失效 
void setMaxInactiveInterval(int second):           设置Session的>超时时间。单位为秒 
void putValue(String attribute, Object value):     不推荐的方法。已经被 setAttribute(String attribute, Object Value)替代 
Object getValue(String attribute):                 不被推荐的方法。已经被 getAttribute(String attr)替代 
boolean isNew():                                   返回该Session是不是>新建立的 
void invalidate():                                 使该Session失效

 

  • Session对浏览器的要求

[1] Session须要使用Cookie做为识别标志

虽然Session保存在服务器,对客户端是透明的,它的正常运行仍然须要客户端浏览器的支持。这是由于Session须要使用Cookie做为识别标志。

 

如何识别?以下识别!

服务器 -----[ Cookie: JSESSIONID with ”session id“ ]-----> 客户端

Session依据该Cookie来识别是否为同一用户。

HTTP协议是无状态的,Session不能依据HTTP链接来判断是否为同一客户,所以服务器向客户端浏览器发送一个名为JSESSIONID的Cookie,它的值为该Session的id(也就是HttpSession.getId()的返回值)。

 

[2] 是否共享 Session

状况1:同一机器的两个浏览器窗口访问服务器时,会生成两个不一样的Session。

状况2:可是由浏览器窗口内的连接、脚本等打开的新窗口(也就是说不是双击桌面浏览器图标等打开的窗口)除外。这类子窗口会共享父窗口的Cookie,所以会共享一个Session。

  

[3] URL地址重写是对客户端不支持Cookie的解决方案。

Step 1,URL地址重写的原理是将该用户Session的id信息重写到URL地址中

Step 2,服务器可以解析重写后的URL获取Session的id。

这样即便客户端不支持Cookie,也可使用Session来记录用户状态。

* 若是客户端支持Cookie,生成原URL地址;

* 若是不支持Cookie,传回重写后的带有jsessionid字符串的地址。 

 

[4] Logout 删除 session

除非程序通知服务器删除一个session,不然服务器会一直保留,程序通常都是在用户作 log off 的时候发个指令去删除 session。

 

[5] 经过 cookie 洞察 session

浏览器历来不会主动在关闭以前通知服务器它将要关闭,所以服务器根本不会有机会知道浏览器已经关闭。

之因此会有这种错觉,是大部分session机制都使用会话cookie来保存session id,而关闭浏览器后这个 session id就消失了,再次链接服务器时也就没法找到原来的session。

若是服务器设置的cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP请求头,把原来的session id发送给服务器,则再次打开浏览器仍然可以找到原来的session。

 

  • Session中禁止使用Cookie

既然WAP上大部分的客户浏览器都不支持Cookie,索性禁止Session使用Cookie,统一使用URL地址重写会更好一些。 

 

 

5、Cookie与Session的区别

  1. cookie数据存放在客户的浏览器上,session数据放在服务器上;
  2. cookie不是很安全,别人能够分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session;
  3. session会在必定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能。考虑到减轻服务器性能方面,应当使用COOKIE;
  4. 单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能超过3K;

Cookie和Session的方案虽然分别属于客户端和服务端,可是服务端的session的实现对客户端的cookie有依赖关系的,

上面我讲到服务端执行session机制时候会生成session的id值,这个id值会发送给客户端,客户端每次请求都会把这个id值放到http请求的头部发送给服务端,而这个id值在客户端会保存下来,保存的容器就是cookie,

所以当咱们彻底禁掉浏览器的cookie的时候,服务端的session也会不能正常使用