其他知识:
浏览器访问某站点时,会自动取出与该站点对应的cookie信息(如果该站点在客户端创建了cookie的话),并将cookie信息内容随请求发到服务器中,最终封装到request对象中。
1.session会话对象是运行于服务器端的服务器对象,不同的客户端访问可以在服务器端同时创建与之对应的session对象。
2.通过request.getSession()/request.getSession(true)方法去创建或获取session对象。因为request对象中封装了全部的客户端请求信息,其中包含一项Cookie属性即
"Cookie: JSESSIONID=DE60D1ED009BE2011D03217245FD1295",这样通过上面的request.getSession()/request.getSession(true)方法很容易就获取与请求的特定客户端的那一个session对象了,独一无二的那一个。
3.客户端某次请求某服务器,如果服务器中运行了request.getSession()/request.getSession(true)方法,那么服务器端才会创建session对象,否则则不会创建。
4.如果客户某次请求服务器时,服务器中运行了request.getSession()/request.getSession(true)方法,那么服务器端创建一个session对象,并且在服务器端生成一个唯一id号来标志此session对象,然后在服务器响应给客户端的时候,会将此id号返回给客户端浏览器,对于http通信,解析出来以后也就是”Set-Cookie JSESSIONID=74E39A7D5A4F6A87A5C64879525445F1; Path=/store“。.
5.在此之后,该客户端如果访问该服务器的其他资源,那么客户端的每次请求都会附加上"Cookie: JSESSIONID=DE60D1ED009BE2011D03217245FD1295"给服务器,即封装到request中,这样服务器端根据request.getSession()/request.getSession(true)方法通过判断(该session上次的访问时间是多少,客户是否长时间没有访问,session是否过期了,客户端是否关闭了浏览器等等)很容易得到该客户端相应的session对象,或者创建一个新的session对象给客户端(session有可能是失效的)。如果session没有失效,那么服务器端不会在给客户端传"Cookie: JSESSIONID=DE60D1ED009BE2011D03217245FD1295",如果session失效,则会生成新的JSESSIONID值并重新给客户端传新的"Cookie: JSESSIONID=DE60D1ED009BE2011D03217245FD1295",客户端更新cookie信息中的“JSESSIONID”值,然后以新的JSESSIONID值为客户端的唯一标识。
6.通过上面的步骤,就可以对http无状态通信,通过session对象的这种会话机制,来建立逻辑上的会话连接。
7.至于连接通道是否长连接还是短连接,TCP连接通道是否keep-Alive了,个人认为,那只是通道问题,占用的服务器和客户端的其他资源,只是通信时间问题和服务器资源的矛盾,与session这样的标志客户端是不一样的,也是没有关系的。因为即使是keep-Alive了,也需要session对象机制来唯一标志客户端。可以理解为那个只是通道。session机制才是说谁在这个通道中两端进行通信。