http是无状态的传输协议,也是最简单有效的通讯方式,后来的互联网进化成了有状态的交互传输,http的无状态传输已经无法满足该互联网的交互需求。
因而产生了保持http状态链接状态的技术,即session和cookie。
客户端的解决方案:
Cookie就是服务器发给客户端的特殊信息,这些特殊信息以文本文件形式存放在客户端,然后客户端每次向服务器发送请求都会带上这些特殊信息。意思就是,客户端访问一个支持cookie的网站时候,用户会提供个人信息提交给服务器,服务器会把相应的个人信息放在HTTP响应头连同相应的文本信息一起会发给客户端,客户端收到响应后,会把这些文本存放在特定位置。从此以后,客户端向服务器端发送请求,都会把特定位置的文本信息一起发送给服务器。
服务器端的解决方案:
session是通过服务器端保持连接状态的,它是服务器端为客户端特定预留的存储空间,在其中创建信息然后创建session。session是服务器运行过程中创建的,并且在创建时候,服务器会为这个session创建一个sessionid,而这个id会在随后的请求中被创建为原来已经存在的session;在session创建后,就可以使用session的方法往session增加内容,而这些内容只会保存在服务器端,发到客户端的只有session id;当客户端再次发送请求时,会带上这个sessionid一起发送,服务器端接受请求后,会根据sessionid找到相对于的session,这样客户端和服务器端的状态就是可以维持了。
session和cookie的关系
它们二者虽然分别属于服务器端和客户端的,但是服务器端session对客户端cookies有依赖关系。服务器端执行session机制产生sessionid,并发送给客户端,客户端每次的请求都会带上这个放在http请求头的id值。这个id值正是保存在cookie容器中。当浏览器完全禁止cookie时候,session就无法正常使用了。
运行session的缺点:
为了补上http协议的无状态特点,服务器端会占用一定的内存和cpu来存储和处理session计算的开销,也就是服务器端并发连接数低的原因之一(例如tomcat并发连接数为200)。因此很多java编写的网站,在生产环境李web容器之前都会添加一个静态资源服务器,例如apache服务器或nginx服务器,静态资源服务器没有解决http无状态的功能,因此部署静态资源服务器不会出现让出内存或cpu计算例如session这样的功能,这部分内存和cpu可以更好的处理http请求,因而静态资源服务器的并发连接数更高。因此,把没有状态保存要求的请求放在静态资源服务器中,要进行状态保存的请求放在java的web容器中处理。