Cookie-Session机制
HTTP协议本身是无状态的,浏览器的每一次请求都是独立的,浏览器不会保存过去的请求信息。服务器为了记录用户的状态就需要使用某种机制来保持会话,在Http传输中采用了Session机制。
Session代表服务器与浏览器的一次会话过程,这个过程是连续的,也可以时断时续的。在Servlet中,session指的是HttpSession类的对象。
2.如何维持会话
服务器创建Session后,会把Session的id号,以cookie的形式回写给浏览器,以后在访问符合cookie规则的页面时,浏览器会把这个cookie添加到请求头发送给服务器,服务器接收到这个cookie时会匹配id号找到当前浏览器的会话。 ID通常是 NAME 为 JSESIONID 的一个 Cookie。
- HTTP和COOKIE交互:
服务器端响应给客户端对应的Set-Cookie。包括了对应的cookie的名称,值,以及各个属性。
3.Servlet中的HttpSession
-
Session创建的时间:
一个常见的误解是以为Session在有客户端访问时就被创建,然而事实是直到某servlet端程序调用 HttpServletRequest.getSession(true)这样的语句时才被创建,JSP会默认调用,如果不打算使用session,应该在所有的JSP中关闭它。 -
Session删除的时间:
- Session超时:超时指的是连续一定时间服务器没有收到该Session所对应客户端的请求,并且这个时间超过了服务器设置的Session超时的最大时间。
- 程序调用HttpSession.invalidate()
- 服务器关闭或服务停止
-
Session会因为浏览器的关闭而删除吗?
不会,session只会通过上面提到的方式去关闭。 -
Session存放在哪里:
服务器端的内存中。不过session可以通过特殊的方式做持久化管理,比如写入数据库或文件中 -
Session是一个容器,可以存放会话过程中的任何对象。
-
Session的创建和使用总在服务端,而浏览器从来都没得到过session对象。但浏览器可以请求Servlet来获取session的信息。客户端浏览器仅仅拿到的是sessionID。
4.URL地址重写维持会话
URL地址重写是对客户端不支持Cookie的解决方案。URL地址重写的原理是将该用户Session的id信息重写到URL地址中。服务器能够解析重写后的URL获取Session的id。这样即使客户端不支持Cookie,也可以使用Session来记录用户状态。HttpServletResponse类提供了encodeURL(Stringurl)实现URL地址重写。
该方法会自动判断客户端是否支持Cookie。如果客户端支持Cookie,会将URL原封不动地输出来。如果客户端不支持Cookie,则会将用户Session的id重写到URL中。