session是什么?
Session是服务器端使用的一种记录客户端状态的机制,使用上比Cookie简单一些,相应的也增加了服务器的存储压力。
session和cookie一样,都是用来记录web服务器和客户端通信状态的机制,session和cookie不同的是,session是保存在服务器上的,session会在用户第一次访问服务器时建立,它相当于一个放在服务器上的用户的“备份档案”,一般与cookie一起使用。
session机制
每次我们访问一个页面,如果有开启session,就会自动生成一个session_id 来标注是这次会话的唯一ID,同时也会自动往cookie里写入一个名字为PHPSESSID的变量,它的值正是session_id,当这次会话没结束,再次访问的时候,服务器会去读取这个PHPSESSID的cookie是否有值有没过期,如果能够读取到,则继续用这个session_id,如果没有,就会新生成一个session_id,同时生成PHPSESSID这个cookie。由于默认生成的这个PHPSESSID cookie是会话,也就是说关闭浏览器就会过期掉,所以,下次重新浏览时,会重新生成一个session_id。
为了获得更高的存取速度,服务器一般把Session放在内存里。每个用户都会有一个独立的Session。如果Session内容过于复杂,当大量客户访问服务器时可能会导致内存溢出。因此,Session里的信息应该尽量精简。
在客户端第一次访问web服务器时,如果开启了session服务,服务器就会生成一个session_id作为用户的唯一标识,然后将session_id发送给cookie。session_id是一串无规律且唯一的字符串,每个用户都会生成一个标识。
当用户再次访问服务器且会话未结束时,服务器只需要从该Session中查找该客户的状态就可以了。
session和cookie
虽然Session保存在服务器,对客户端是透明的,它的正常运行仍然需要客户端浏览器的支持。这是因为Session需要使用Cookie作为识别标志。HTTP协议是无状态的,Session不能依据HTTP连接来判断是否为同一客户,因此服务器向客户端浏览器发送一个名为JSESSIONID的Cookie,它的值为该Session的id(也就是HttpSession.getId()的返回值)。Session依据该Cookie来识别是否为同一用户。
当允许浏览器使用cookie的时候,session就会依赖于cookies,当浏览器不支持cookie后,就可以通过第二种方式获取session内存中的数据资源。
session是保存在服务器上的,但由于http协议是无状态的,服务器不能借助session来辨别用户的身份,所以服务器需要注入一个叫sessionID的变量给cookie,然后客户端会带着这个ID去请求服务器,服务器会在内存中查找用户的session,来快速识别用户的状态。
当会话断开后,sessionID就会过期,直到再次建立会话后重新生成,这是因为session是保存在服务器的内存中的,为了降低服务器的压力,session的生存周期一般比cookie短。
session和URL重写
URL地址重写是对客户端不支持Cookie的解决方案。URL地址重写的原理是将该用户Session的id信息重写到URL地址中。服务器能够解析重写后的URL获取Session的id。这样即使客户端不支持Cookie,也可以使用Session来记录用户状态。HttpServletResponse类提供了encodeURL(Stringurl)实现URL地址重写。