[web] 四种会话跟踪技术

在程序中,会话跟踪是很重要的事情。理论上,一个用户的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个会话,二者不能混淆。例如,用户A在超市购买的任何商品都应该放在A的购物车内,不论是用户A什么时间购买的,这都是属于同一个会话的,不能放入用户B或用户C的购物车内,这不属于同一个会话。

而Web应用程序是使用HTTP协议传输数据的。HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。即用户A购买了一件商品放入购物车内,当再次购买商品时服务器已经无法判断该购买行为是属于用户A的会话还是用户B的会话了。要跟踪该会话,必须引入一种机制。目前普遍存在四种会话跟踪技术:URL重写、隐藏表单域、Cookie、Session。

1 隐藏表单域

<input type="hidden" id="xxx" value="xxx">
  • 参数是存放在请求实体里的,因此没有长度限制,但是不支持 GET 请求方法,因为 GET 没有请求实体
  • 当Cookie被禁用时依旧能够工作
  • 不存在持久性,一旦浏览器关闭就结束

2 URL 重写

可以在 URL 后面附加参数(比如sessionId),和服务器的请求一起发送,这些参数为键/值对

  • 参数是存放在 url 里的,有1024长度限制
  • 当Cookie被禁用时依旧能够工作
  • 不存在持久性,一旦浏览器关闭就结束

3 Cookie

Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

但是使用 Cookie 有一个很大的弊端,Cookie 中的所有数据在客户端就可以被修改,数据非常容易被伪造,那么一些重要的数据就不能存放在 Cookie 中了,而且如果 Cookie 中数据字段太多会影响传输效率。为了解决这些问题,就产生了 Session,Session 中的数据是保留在服务器端的。cookie存储sessionId

Cookie常用属性

  • String name:该Cookie的名称。Cookie一旦创建,名称便不可更改
  • Object value:该Cookie的值。如果值为Unicode字符,需要为字符编码。如果值为二进制数据,则需要使用BASE64编码
  • int maxAge:该Cookie失效的时间,单位秒。
    • 如果为正数,则该Cookie在maxAge秒之后失效。
    • 如果为负数,该Cookie为临时Cookie,关闭浏览器即失效,浏览器也不会以任何形式保存该Cookie。
    • 如果为0,表示删除该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并不提供修改、删除操作。如果要修改某个Cookie,只需要新建一个同名的Cookie,添加到response中覆盖原来的Cookie。

如果要删除某个Cookie,只需要新建一个同名的Cookie,并将maxAge设置为0,并添加到response中覆盖原来的Cookie。注意是0而不是负数。负数代表其他的意义。读者可以通过上例的程序进行验证,设置不同的属性。

注意:修改、删除Cookie时,新建的Cookie除value、maxAge之外的所有属性,例如name、path、domain等,都要与原Cookie完全一样。否则,浏览器将视为两个不同的Cookie不予覆盖,导致修改、删除失败。

4 Session

Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。

如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。

为了获得更高的存取速度,服务器一般把Session放在内存里。为防止内存溢出,服务器会把长时间内没有活跃的Session从内存删除。这个时间就是Session的超时时间。如果超过了超时时间没访问过服务器,Session就自动失效了。

cookie和session的区别

  1. cookie数据存放在客户的浏览器上,session数据放在服务器上,而sessionID是保存在cookie中的

  2. cookie默认情况下也会随着浏览器进程结束而结束,但是如果手动指定了过期时间,则不受浏览器进程影响。Session的默认超时时间为20分钟,即使没到时间也会随着浏览器进程结束而结束

  3. cookie只能存储 String 类型的对象,session能够存储任意的 java 对象

  4. Cookie存在客户端对服务器没影响,Session过多时会消耗服务器资源,大型网站会有专门Session服务器

另外:token

Token是什么

token是用户身份的验证方式,我们通常叫它:令牌。最简单的token组成:uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,由token的前几位+盐以哈希算法压缩成一定长的十六进制字符串,可以防止恶意修改token请求服务器)。还可以把不变的参数也放进token,避免多次查库。用户信息都被加密到token中,服务器收到token后解密就可知道是哪个用户。

你可能感兴趣的:(web,http,ajax,html5)