cookie与session

会话(session)跟踪式web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是cookie与session。coolie是通过在客户端记录信息确定用户身份,session是通过在服务端记录信息确定用户身份。

cookie技术是客户端解决方案。cookie是由服务器发给客户端的特殊信息,这些信息以文本的方式存放在客户端,客户端每次向服务器发送请求的时候都会带上这些特殊的信息。

例如:在用户访问一个网站的时候,先登录,用户将用户名和密码发送给服务器;服务器对用户名和密码进行验证,验证成功后,会向客户端回传相应的超文本信息的同时也是返回这些个人信息,这些个人信息存放在HTTP的头部;当客户端接收到服务端的响应之后,浏览器会将这些个人信息存放在一个统一的位置;后面如果客户端再向服务端请求的时候,都会把cookie信息发回到服务器。服务器在接收到来自客户端的请求之后,分析存放于请求头的cookie信息,得到用户相关信息,从而生成与该客户端请求的内容。

cookie是弥补HTTP协议的无状态的不足。

cookies是HTTP的一个扩展,有两个专门负责设置以及发送cookie的http头部,Set-Cookie和Cookie。当服务器返回给客户端一个http响应时,如果包含Set-Cookie这个头部时,指示客户端建立一个新的cookie,并且在后续的http请求中自动发送这个cookie到服务端,直到这个cookie过期。如果cookie的生存时间是整个会话期间,浏览器会将cookie保存在内存中个,在浏览器关闭的时候会自动清除这个cookie。cookie也可以保存在客户端的磁盘上,这种情况,在浏览器关闭之后,该cookie也不会清除,下次打开浏览器访问对应网站的时候,这个cookie就会自动再次发送到服务器端。

客户端发送一个http请求到服务器端,服务器端发送一个http响应到客户端,其中包含Set-Cookie头部

客户端发送一个http请求到服务器端,其中包含Cookie头部

cookie的不可跨域性

很多网站都会使用cookie,但是不同网站的只能使用本网站生成的cookie,不能进行跨域访问。

cookie中使用Unicode字符时,需要对Unicode字符进行编码,否则会乱码

cookie不仅可以使用ASCII字符与Unicode字符,还可以使用二进制数据,


session

web应用中还经常使用session来记录客户端的状态,session是服务器端使用的一种记录客户端状态的机制,比cookie简单,但是会增加服务器的存储压力

session技术是服务器端的解决方案,它是通过服务器来保持状态的,客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上,这个就是session。客户端浏览器再次访问时只需要从该session中查找客户的章台就可以了。

session类似在服务器上建立了一个客户档案,客户来访的时候只需要查询客户档案就可以了。

session的生命周期

session是保存在服务端的,为了获得更高的存取速度,服务器一般把session放在内存中,每个用户都会拥有一个独立的session。如果session的内容太复杂,当亮亮客户访问的时候,会导致服务器内存溢出。所以session里的信息应当尽量精简。

session在用户第一次访问服务器的时候自动创建,访问服务器端的静态资源是不会产生session的

session生成后,用户只要继续访问,服务器就会更新session的最后访问时间,并维护该sessin,用户没访问服务器一次,无论是否读写session,服务器都认为该用户的session“活跃”了一次

session的有效期

由于访问服务端的用户会越来越多,因此session也会越来越多,为了防止内存溢出,如果超过了超时时间也没有访问服务器端,该session就会自动失效了。

session对浏览器的要求

虽然session保存在服务器端,对客户端是透明的,它的正常运行任然需要客户端浏览器的支持,因为session需要使用cookie作为识别标志。HTTP协议是无状态的,session不能通过HTTP链接来判断是否是同一个用户,因此服务器向客户端浏览器发送一个名为JSESSIONID的cookie,它的值为该Session的id。

该cookie是服务器端自动生成的,它的maxAge属性为-1,表示仅当前浏览器内有效,并且个浏览器窗口见不共享,关闭浏览器就会消失。

同一台机器的两个浏览器窗口访问服务器时,会生成两个不同的session,但是有浏览器窗口内的链接,脚本等打开的新窗口除外。这类子窗口会共享父窗口的cookie,因此会共享一个session。

新打开的浏览器窗口会生成新的session,但子窗口除外,子窗口会共享父窗口的session。

如果客户端浏览器将cookie禁用,或者不支持cookie怎么办(绝大数手机浏览器不支持cookie)?

URL地址重写

URL重写

URL地址重写是对客户端不支持cookie的解决方案

URL地址重写的原理就是将用户的session的id信息重写到URL地址中,服务器能够够解析重写后的URL,从而获取session的id。这样即使客户端不支持cookie,也可以使用session来记录用户的状态了。

cookie与session的区别

  1. cookie数据存在客户端的浏览器上,session数据存放在服务器上

  2. cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当那个使用session

  3. session会在一定时间内保存在服务器上,当访问量增多,会占用比较多的服务器资源,考虑到减轻服务器性能方面,应当使用cookie

  4. 的那个cookie在客户端的限制是3k,就是说一个站点在客户端存放的cookie不能超过3k